Подтвердить что ты не робот

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(); ??
  }
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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