Java: вызов super после перемещения кода в другой класс

У меня есть метод, который переопределяется, и в этом методе super используется для вызова метода, который переопределяется. Однако код в этом методе я использую в нескольких классах, и поэтому я хочу повторно использовать этот код, поместив его в один метод только в одном классе. Но поскольку в этом коде используется ключевое слово super, я не знаю, как передать ссылку на переопределенный метод моему новому методу. Например, вот исходный метод inc class1:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
   /* Lots of code goes here, followed by the super call */
   return super.onOptionsItemSelected(item);
}

В классе2:

public boolean onOptionsItemSelected(MenuItem item)
{
   /* Code from class1 gets relocated here. But how do I call super on the original method? */

}

person AndroidDev    schedule 28.05.2012    source источник
comment
Делегировать   -  person alphazero    schedule 29.05.2012


Ответы (2)


Ну, если класс 2 не является общим предком вашего класса 1, вы не можете вызывать его с помощью super. Если вы переместите свой код в другой класс, не связанный наследованием, вы будете вынуждены использовать композицию объектов, то есть вашему классу 1 (где сегодня находится супервызов) потребуется ссылка на объект класса 2 (где код был перемещен в ) объект, чтобы получить доступ к данному методу.

public boolean onOptionsItemSelected(MenuItem item)
{
   /* Lots of code goes here, followed by the super call */
   return this.myRef.onOptionsItemSelected(item);
}

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

public boolean onOptionsItemSelected(MenuItem item)
    {
       /* Lots of code goes here, followed by the super call */
       return Util.onOptionsItemSelected(item);
    }

Однако в зависимости от того, что делает метод, сделать его статическим может быть невозможно.

person Edwin Dalorzo    schedule 28.05.2012
comment
вашему классу 1 потребуется ссылка на объект класса 2, чтобы получить доступ к методу. Но я хочу, чтобы это было наоборот. Class2 должен получить доступ к методу в class1. - person AndroidDev; 28.05.2012
comment
@AndroidDev В вашем примере ваш class1 вызывает super у общего предка. Вы перемещаете код этого общего предка в class2, верно? - person Edwin Dalorzo; 28.05.2012
comment
Да. И супер на самом деле появляется много раз в этом коде, но я сделал его простым и показал только один раз. Я не перемещаю код от общего предка. Я перемещаю код из class1 в class2. OnOptionsItemSelected по-прежнему остается в классе 1. class1 наследуется от другого класса. - person AndroidDev; 28.05.2012

Вы можете просто сделать так, чтобы Class2 расширял тот же класс, что и Class1.

Остальная часть этого ответа предполагает, что Class1 не наследуется от Class2.

Без дополнительного контекста трудно сказать, подходит ли это, но вы можете попробовать изменить

public boolean onOptionsItemSelected(MenuItem item)

to

public static boolean onOptionsItemSelected(MenuItem item) и звоните

YourClassName.onOptionsItemSelected(yourArgument)

person Zéychin    schedule 28.05.2012
comment
Я не понимаю, как супер может называться во всем этом. - person AndroidDev; 28.05.2012
comment
super нельзя использовать так, как вы этого хотите. Трудно сказать без иерархии классов вашего примера. Не указано, расширяют ли Class1 и Class2 один и тот же класс, или Class2 расширяет Class1, или наоборот. - person Zéychin; 29.05.2012