Java - расширение класса и повторное использование методов?
public class BaseClass {
public void start() {
// do something
}
}
public class ClassA extends BaseClass {
}
ClassA c = new ClassA();
c.start();
В следующем коде я хочу использовать метод start(), как он был определен в суперклассе, я видел во многих других кодеках разработчиков, что они переопределяют метод в суперклассе, а затем они называют супер, есть ли причина для этого?
public class ClassA extends BaseClass {
@Override
public void start() {
super.start();
}
}
Ответы
Ответ 1
Ясность? Некоторые разработчики считают, что яснее показать метод в подклассе. Я не согласен. Это избыточная информация.
По крайней мере, начиная с Java 5, вы можете добавить @Override, чтобы компилятор сообщил вам, изменяется ли подпись/исчезает.
За исключением конструкторов. Для конструкторов вам действительно нужно создавать свои собственные с той же подписью и делегировать вверх. В этом случае опускание не эквивалентно.
Ответ 2
Переопределяя метод, делая что-то особенное, вызов super.method()
называется украшением метода - вы добавляете к поведению. Подробнее здесь: Рисунок декоратора.
Переопределение без вызова метода super просто переопределяет метод - изменение поведения.
Ответ 3
public class ClassA extends BaseClass {
@Override
public void start() {
super.start();
}
}
делает то же самое, что и вообще не переопределяет
public class ClassA extends BaseClass {}
Итак, если у вас нет дополнительных функций для добавления (в этом случае вы вызываете метод суперкласса, а затем добавляете дополнительную логику) или делать что-то другое (вы не называете метод суперкласса и просто определяете какую-то другую логику) вам лучше не переопределять метод суперкласса (и вызвать метод суперкласса), потому что это бессмысленно.
Ответ 4
Я иногда делаю это (временно, во время разработки), когда я хочу установить там точку останова.
Ответ 5
Основной причиной концепции наследования является обобщение функций или операций, которые являются общими для подклассов. Имеет смысл переопределить только тогда, когда нам нужно настроить операцию для конкретного подкласса.
-
Но в одном месте, где нам нужно сделать переопределение, скажем, вы перегрузили свой конструктор по умолчанию суперкласса, а затем в подклассе вам нужно упомянуть о вызове перегруженного суперклассического конструктора в качестве первой строки в вашем подклассе конструктор (т.е. объект суперкласса должен быть создан до создания подкласса).
Например
класс BaseClass {
BaseClass (арг1) {
}
}
класс A расширяет BaseClass {
а { супер (arg1); }
}
В других местах это только добавило бы избыточность кода, который вовсе не нужен