#oop #class #object
#ооп #класс #объект
Вопрос:
В академических целях мне интересно, должен ли вызов родительского метода приводить к вызову родительского метода родителя в случае, когда у родителя нет такого метода?
Например (псевдокод):
class A {
function doSomething() {
}
}
class B extends A {}
class C extends B {
function doSomething() {
parent::doSomething();
}
}
i = new C();
i->doSomething();
Означает ли родительский вызов в объектно-ориентированных языках, что если у родителя отсутствует метод, вместо него будет вызван его родительский метод?
Ответ №1:
В ООП на этот вопрос обычно отвечает видимость функции doSomething
.
Если он был защищен или общедоступен в классе A
, тогда да, он будет вызван, если он не переопределен в B
(Здесь я также предполагаю, что extends
ключевое слово является общедоступным наследованием. Смотрите http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers / для получения дополнительной информации.)
Комментарии:
1. Предполагая,
public
таким образом, ответyes
(поскольку B явно ничего не переопределяет)?2. Да, вы также можете попробовать это 🙂
3. Я писал, пока Виктор Пармар публиковал. Избыточность не была преднамеренной . . . 😉
Ответ №2:
Семантика родительско-дочернего «extends» / single inheritance настоятельно подразумевает, что «везде, где вы могли бы использовать родительский элемент, вы также можете использовать дочерний элемент».
То есть функции дочернего элемента должны быть надмножеством родительских.
Таким образом, большинство разумных реализаций одиночного наследования сделают поведение дочернего элемента по умолчанию идентичным родительскому из-за вышеупомянутого принципа.
Конечно, могут быть и другие факторы, например, язык может поддерживать интерфейсы, дизайн по контракту и т.д. — В этом случае родительский метод может быть заглушкой или абстрактным методом, не подлежащим вызову, или может действовать неизвестно какая политика.
примечание: Разговор в других ответах о public-vs-private действительно специфичен для Java-подобных языков, а не (как подразумевают теги вопроса) общего ООП. Если только вы не считаете, что видимость является частью общего ООП (язык python может возражать).
Ответ №3:
Если область действия doSomething, определенная в A, является общедоступной, то doSomething также является частью общедоступной внутренней области B. Следовательно, метод doSomething также будет частью общедоступного интерфейса C. Поскольку исходный метод, определенный в A в, наследуется производными классами, родительский метод будет вызываться производными классами, если он не переопределен.
В определенной степени детали того, как все это работает в определенных областях, могут определяться конкретными языками, но общие принципы OO следуют концепции, описанной выше . . .