Вызов метода супер суперкласса

Скажем, у меня есть три класса A, B и C.

  • B расширяет A
  • C расширяет B

Все они имеют метод public void foo () .

Теперь из метода C foo () я хочу вызвать функцию foo () . ] method (НЕ метод его родительского B, а метод суперкласса A.)

Я попытался super.super.foo (); , но это неверный синтаксис. Как мне этого добиться?

35
задан Boann 5 May 2015 в 21:46
поделиться

5 ответов

Вы даже не можете использовать отражение. Что-то вроде

Class superSuperClass = this.getClass().getSuperclass().getSuperclass();
superSuperClass.getMethod("foo").invoke(this);

приведет к InvocationTargetException , потому что даже если вы вызовете foo-Method в superSuperClass, он все равно будет использовать C.foo () , когда вы укажете "this "в invoke. Это следствие того факта, что все методы Java являются виртуальными методами.

Похоже, вам нужна помощь класса B (например, путем определения метода superFoo () {super.foo ();} ).

Тем не менее, если вы попробуете что-то вроде этого, это выглядит как проблема дизайна, поэтому было бы полезно дать нам некоторую предысторию: Почему вам нужно это сделать?

32
ответ дан 27 November 2019 в 07:09
поделиться

Вы не можете - потому что это нарушит инкапсуляцию.

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

20
ответ дан 27 November 2019 в 07:09
поделиться

Я чую здесь что-то подозрительное.

Вы уверены, что не заходите слишком далеко, «только потому, что должны уметь это делать»? Вы уверены, что это лучший шаблон дизайна, который вы можете получить? Вы пробовали его рефакторинг?

0
ответ дан 27 November 2019 в 07:09
поделиться

Вы не можете этого сделать просто.

Это то, что я думаю, вы можете сделать:

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

Надеюсь, это поможет.

3
ответ дан 27 November 2019 в 07:09
поделиться

Это невозможно, мы ограничены вызовом только реализации суперкласса.

0
ответ дан 27 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

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