2010-04-06 2 views
23

Можно создать дубликат:
Why is super.super.method(); not allowed in Java?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(); ?? 
    } 
} 
+0

Зачем вам это делать? Можете ли вы привести пример? – Macarse

ответ

18

Вы не можете. Это преднамеренно.

Класс B предоставляет интерфейс (как в концепции, а не ключевое слово Java) для подклассов. Он решил не предоставлять прямой доступ к функциям A.myMethod. Если вам требуется B, чтобы предоставить эту функциональность, используйте для этого другой метод (другое имя, сделайте это protected). Однако, вероятно, лучше «предпочесть состав над наследованием».

+0

Спасибо, ребята! я постараюсь доработать мой дизайн. – Arkaha

+0

Arkaha, см. Мой ответ на ваш вопрос. Синтаксически можно вызывать метод, определенный суперклассом, который не является вашим непосредственным предком (ваш * супер *). Но у вас должна быть веская причина для этого. –

0

Я не уверен, что вы можете. Java делает все методы виртуальными по умолчанию. Это означает, что самое простое решение не будет работать: объявите переменную типа A, назначьте ей свой экземпляр C и вызовите myMethod, в результате вызывается C.myMethod.

Вы можете попытаться описать типоразмер A и непосредственно ссылаться на свои методы. Было бы интересно посмотреть, что произойдет в этом случае, но я был бы удивлен, если бы виртуальная отправка не произошла ...

2

Вы не можете, и вы не должны.

Это признак плохого дизайна. Переименуйте метод или включите требуемые общие функции в другой метод или в класс утилиты.

+1

Reflection * также * не дает способа сделать это, нормальные правила полиморфизма времени выполнения будут ** применяться **. Вы даже не можете реализовать 'super.myMethod()' используя отражение, не говоря уже о теоретическом 'super.super.myMethod()'. –

+0

правильный. обновлено. – Bozho

+0

Не обязательно, вам нужно это сделать, когда вы определяете внутренние классы (например, определяете действия слушателей в Swing или call back classes.) Вне таких ситуаций да, это плохой дизайн, но * сам по себе * это не так. Синтаксис Java поддерживает его в любом случае (см. Мой ответ на вопрос Аркахи). –