2012-05-28 3 views
0

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

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

В class2:

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

} 
+0

[Делегат ] (http://en.wikipedia.org/wiki/Delegation_pattern) – alphazero

ответ

1

Ну, если класс 2 не является общим предком вашего 1-го класса, вы не можете вызвать его с супер , Если вы переместили свой код в другой класс, не связанный с наследованием, вы были бы вынуждены использовать композицию объекта, то есть ваш класс 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); 
    } 

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

+0

"твоя кла ss 1 понадобится ссылка объекта на объект класса 2, чтобы получить доступ к методу ». Но я хочу, чтобы это было наоборот. Class2 должен получить доступ к методу в классе1. – AndroidDev

+0

@AndroidDev В вашем примере ваш класс1 является тем, который вызывает супер в общем предке. Вы перемещаете код этого общего предка в класс2, верно? –

+0

Да. И супер действительно появляется много раз в этом коде, но я оставил его простым и только показал его один раз. Я не перемещаю код из общего предка. Я перемещаю код из класса1 в класс2. OnOptionsItemSelected все еще остается в классе1. class1 наследуется от какого-то другого класса. – AndroidDev

0

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

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

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

public boolean onOptionsItemSelected(MenuItem item)

в

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

YourClassName.onOptionsItemSelected(yourArgument)

+0

Я не вижу, как супер называется в любом из них. – AndroidDev

+0

'super' не может быть использован так, как вы хотите. Трудно сказать без иерархии классов вашего примера. Не указано, расширяет ли Class1 и Class2 один и тот же класс, или если Class2 расширяет Class1 или наоборот. –

 Смежные вопросы

  • Нет связанных вопросов^_^