В некоторых языках, например, в Ruby, методом класса initialize, используемым для инициализации новых объектов, нельзя напрямую вызвать в дочернем классе super.initialize для выполнения логики родительского класса. Вместо этого, дочерний класс должен своей реализацией initialize явным образом вызвать метод super, который автоматически вызывает метод initialize родительского класса.
Какой метод невозможно переопределить в объектно-ориентированном программировании?
В некоторых языках, например, в Ruby, методом класса initialize, используемым для инициализации новых объектов, нельзя напрямую вызвать в дочернем классе super.initialize для выполнения логики родительского класса.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В некоторых языках, например, в Ruby, методом класса initialize, используемым для инициализации новых объектов, нельзя напрямую вызвать в дочернем классе super.initialize для выполнения логики родительского класса. Вместо этого, дочерний класс должен своей реализацией initialize явным образом вызвать метод super, который автоматически вызывает метод initialize родительского класса.
В других языках, например, в Java или C#, нет "непереопределяемых" пользовательских методов в том смысле, что любой публичный или защищенный (!) метод, не помеченный как final (Java) или sealed (C#), может быть переопределен. Однако, можно считать, что конструкторы являются особым типом "метода", который нельзя переопределить в привычном смысле - нельзя объявить метод с тем же именем и сигнатурой внутри дочернего класса, который бы заменял родительский конструктор. Дочерний класс может иметь свои собственные конструкторы, которые, в свою очередь, вызывают конструкторы родительского класса через super (Java) или : base (C#).
class Parent {
Parent() {
System.out.println("Parent constructor");
}
void method() {
System.out.println("Parent method");
}
}
class Child extends Parent {
Child() {
// Явный вызов конструктора родителя не нужен,
// если нет параметров - вызывается автоматически.
System.out.println("Child constructor");
}
@Override // Переопределение метода возможно
void method() {
System.out.println("Child method");
}
}
Таким образом, в общем смысле, конструкторы можно считать методом, который невозможно переопределить в том же понимании, что и обычные методы.