Могут ли объекты определять новые родственные или дочерние классы в ООП? Почему или почему нет?

Возможно ли для самого класса определить новый класс в ООП? Существуют ли языки (Lisp и т. Д.), Которые могут это позволить? Это что-то, что может быть сделано в ООП вообще, или есть логические недостатки в этой концепции (возможно, что-то похожее на то, что базовый класс «объект» не может переопределить новый класс «объект»?)

Например; Если класс «B» является подклассом суперкласса «A», можете ли вы теоретически закодировать блок перехвата в «B», чтобы создать новый родственный класс «C» суперкласса «A» всякий раз, когда обнаруживается конкретная ошибка? Или это было бы совершенно недоступно для традиционных языков программирования?

Сегодня я впервые прочитал о Лиспе, и концепция редактирования фактических структур данных в языке заставила меня задуматься об этом. Благодарю.

1

Решение

Такие языки, как Javascript и Python, рассматривают функции и методы как объекты, и, заменяя эти функции и методы, разработчик может динамически изменять объект и его поведение во время выполнения. Это можно сравнить с «определением нового класса», но в динамически типизированных (или утино-типичных) языках это означает очень мало.

В строго типизированных языках, таких как Java, разработчик может создать «анонимный внутренний класс» без имени, но со ссылкой на конечные переменные, установленные в области видимости.

abstract class CustomAdder {
abstract int add(int datum);

static CustomAdder createCustomAdder(final int numberToAdd) {
return new CustomAdder() {
@Override int add(int datum) {
return numberToAdd + datum;
}
};
}
}

// elsewhere
CustomAdder fiveAdder = CustomAdder.createCustomAdder(5);
fiveAdder.add(4); // returns 9
CustomAdder tenAdder = CustomAdder.createCustomAdder(10);
tenAdder.add(20); // returns 30

Вы можете утверждать, что анонимный внутренний класс — это не что иное, как обычный класс без имени, с некоторыми неявными параметрами конструктора, и вы были бы правы; на самом деле эти классы компилируются в отдельные пронумерованные файлы классов. Однако не стоит сильно беспокоиться об этом: так или иначе, код, который выполняет программа, — это код, который какой-то разработчик напечатал на этом конкретном языке, независимо от того, какой файл содержит его.

Конечно, программы могут также генерировать и динамически компилировать / загружать код на языках ассемблера или компьютера, но я предполагаю, что вы не это имеете в виду. 🙂

0

Другие решения

Конечно, Common Lisp позволяет создавать классы во время выполнения.

3

По вопросам рекламы [email protected]