Java: То, как Вы получаете доступ к методу родительского класса два, уравнивает?

У меня есть класс, который расширяет класс, в котором я нуждаюсь сверхъязю, но я должен назвать родительский класс того класса. так как я не могу звонить супер, так как это выполнит прямого родителя, что лучший способ состоит в том, чтобы получить родителя моего родительского класса?

Я уверен, что это - основной вопрос, но его некоторое время, так как я делал любой Java.

class A
{
 public void myMethod()
 { /* ... */ }
}

class B extends A
{
 public void myMethod()
 { /* Another code */ }
}

class C extends B
{
 I need to call Class A here
 { /* Another code */ }
}
27
задан Jim Ferrans 25 June 2010 в 12:56
поделиться

5 ответов

Вы не делаете: это нарушает инкапсуляцию.

Можно сказать: «Нет, я не хочу своего собственного поведения - я хочу поведения своего родителя», потому что предполагается, что вы сделаете это только тогда, когда он будет правильно поддерживать ваше собственное состояние.

Однако вы не можете обойти поведение своего родителя - это помешает ему обеспечить собственную последовательность. Если родительский класс хочет, чтобы разрешил вам вызывать дедушку напрямую, он может раскрыть это через отдельный метод ... но это зависит от родительского класса.

30
ответ дан 28 November 2019 в 05:15
поделиться

Вы не можете, потому что он был переопределен B. Внутри C нет экземпляра A.

Дело в том, что вы хотите вызвать метод класса A, но из какого экземпляра? Вы инстанцировали C, который является классом с парой собственных и унаследованных от B методов. Если B переопределяет метод A, вы не можете получить доступ к нему из C, потому что сам метод принадлежит C (не является методом B, он был унаследован и теперь находится в C)

Возможные обходные пути:

B не переопределяет myMethod()

C получает экземпляр A и сохраняет его как свойство класса.

myMethod() в A статичен и вы используете A.myMethod() (не рекомендую)

9
ответ дан 28 November 2019 в 05:15
поделиться

Помимо ответа pakore, вы также можете связать вызовы super.myMethod () , если это сработает для вас. Вы вызовете myMethod () из A из myMethod () в B.

class A {
   public void myMethod() {
     ....
   }
}

class B extends A {
   public void myMethod() {
     ....
     super.myMethod();
     ....
   }
}

class C extends B {
  public void myMethod() {
    ....
    super.myMethod(); //calls B who calls A
    ....
  }
}

В конечном итоге вы будете вызывать myMethod из A, но косвенно ... Если это сработает для вас .

1
ответ дан 28 November 2019 в 05:15
поделиться

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

class A
{
   public myMethod() {
        doAMyMethod();
   }

   void doAMyMethod() {
      // what A want's on doMyMethod, but now it's available
      // as a separately identifiable method
   }
}

class C extends B
{
   public void someStuff() {
      this.doAMyMethod();
   }
}

Схема отделяет открытый интерфейс (doMyMethod) от реализации (doAMyMethod). Наследование действительно зависит от деталей реализации, и поэтому это не так уж плохо, но я бы попытался избежать этого, если возможно, поскольку это создает тесную связь между реализацией в A и C.

0
ответ дан 28 November 2019 в 05:15
поделиться

То, что вы спрашиваете, является плохой практикой. Вы говорите, что C - это не B, а A. Что вам нужно сделать, это унаследовать C от A. Тогда вы можете вызвать super.

Если нет, то это единственный способ ...

public String A()
{
String s = "hello";
return s;
}

public String B()
{
String str = super.A();
return str;
}

public String C()
{
String s = super.B();
return s;
}
6
ответ дан 28 November 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: