Скажем, у меня есть три класса A, B и C.
Все они имеют метод public void foo ()
.
Теперь из метода C foo ()
я хочу вызвать функцию foo ()
. ] method (НЕ метод его родительского B, а метод суперкласса A.)
Я попытался super.super.foo ();
, но это неверный синтаксис.
Как мне этого добиться?
Вы даже не можете использовать отражение. Что-то вроде
Class superSuperClass = this.getClass().getSuperclass().getSuperclass();
superSuperClass.getMethod("foo").invoke(this);
приведет к InvocationTargetException
, потому что даже если вы вызовете foo-Method в superSuperClass, он все равно будет использовать C.foo ()
, когда вы укажете "this "в invoke. Это следствие того факта, что все методы Java являются виртуальными методами.
Похоже, вам нужна помощь класса B (например, путем определения метода superFoo () {super.foo ();}
).
Тем не менее, если вы попробуете что-то вроде этого, это выглядит как проблема дизайна, поэтому было бы полезно дать нам некоторую предысторию: Почему вам нужно это сделать?
Вы не можете - потому что это нарушит инкапсуляцию.
Вы можете вызвать метод своего суперкласса, потому что предполагается, что вы знаете, что нарушает инкапсуляцию в вашем собственном классе, и избегаете этого ... но вы не знаете, какие правила применяет ваш суперкласс - так что вы не можете просто обойти реализацию там.
Я чую здесь что-то подозрительное.
Вы уверены, что не заходите слишком далеко, «только потому, что должны уметь это делать»? Вы уверены, что это лучший шаблон дизайна, который вы можете получить? Вы пробовали его рефакторинг?
Вы не можете этого сделать просто.
Это то, что я думаю, вы можете сделать:
Имейте bool в своем классе B. Теперь вы должны вызвать foo B из C, например [super foo]
, но перед этим установите для bool значение истинный. Теперь в foo B проверьте, истинно ли bool, затем не выполняйте никаких шагов в этом и просто вызовите foo A.
Надеюсь, это поможет.
Это невозможно, мы ограничены вызовом только реализации суперкласса.