Java Как назвать метод великих родителей?
Возможный дубликат:
Почему супер .super.method(); не разрешено в Java?
Предположим, что у меня есть 3 класса A
, B
и C
, каждый из которых расширяет предыдущий.
Как мне вызвать код в A.myMethod()
из C.myMethod()
, если B
также реализует myMethod
?
class A
{
public void myMethod()
{
// some stuff for A
}
}
class B extends A
{
public void myMethod()
{
// some stuff for B
//and than calling A stuff
super.myMethod();
}
}
class C extends B
{
public void myMethod()
{
// some stuff for C
// i don't need stuff from b, but i need call stuff from A
// something like: super.super.myMethod(); ?? how to call A.myMethod(); ??
}
}
Ответы
Ответ 1
Вы не можете. Это преднамеренно.
Класс B
предоставляет интерфейс (как в концепции, а не ключевое слово Java) для подклассов. Он решил не предоставлять прямой доступ к функциям A.myMethod
. Если вам требуется B
, чтобы предоставить эту функциональность, используйте для нее другой метод (другое имя, сделайте это protected
). Однако, вероятно, лучше "предпочесть состав над наследованием".
Ответ 2
Вы не можете, и вы не должны.
Это признак плохого дизайна. Переименуйте метод или включите требуемую общую функциональность в другом методе или в класс утилиты.
Ответ 3
Я не уверен, что ты сможешь. Java делает все методы виртуальными по умолчанию. Это означает, что самое простое решение не будет работать: объявите переменную типа A
, присвойте ей экземпляр C
, и вызов myMethod
приведет к вызову C.myMethod
.
Вы можете попытаться отобразить тип A
и вызвать его методы напрямую. Было бы интересно посмотреть, что произойдет в этом случае, но я был бы удивлен, если виртуальная отправка не произойдет...