2013-06-26 5 views
7

Я действительно смущен тем, как люди используют супер в переопределенных методах. Как что это отличается отВызов супер в конце

@Override 
    protected void onResume() { 
    // some logic here 
    super.onResume(); 
    } 

и

@Override 
    protected void onResume() { 
    super.onResume(); 
    // some logic here 
    } 

он выполняет ли какой-либо предварительной обработки, когда мы называем супер() в конце, потому что обычно мы называем супер инициализировать родительский конструктор.

Любая разница в производительности с обоими видами.

+1

http://stackoverflow.com/questions/4994959/locations-of-super-calls-in-android-eclipse-plugin-generated-code-reliable – Neil

+1

Вы путаете конструктор вызовов с вызовами методов (' super.method() '. Также ваш код не компилируется. –

+0

Суперкласс в FIRST:' onRestoreInstanceState, onStop, onRestart, onStart'. Ваши коды: FIRST: 'onDestroy, onPause, onSaveInstanceState, onResume' –

ответ

17

Во-первых, пустое super() не допускается в методах вообще - только в конструкторах. Я предполагаю, что вы на самом деле означали super.someMethod() для соответствующего метода.

Выполняет любую предварительную обработку, когда мы вызываем super() в конце, потому что обычно мы вызываем super для инициализации родительского конструктора.

Использование метода super в способе несколько отличается от его использования в конструкторе.

В конструктора, super (или this) является требуется быть очень первым оператором (если он присутствует, с неявной super() иным образом), и она может только вызова конструктор.

В способе использование super.someMethod() просто вызывает реализацию суперкласса someMethod. Вы можете назвать это от любым способом (вы не должны переопределять someMethod в то время), и вы можете вызвать его в любой момент в методе. Он вызывается в тот момент, когда вы его вызываете, он просто избегает полиморфного вызова для переопределенной реализации.

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

+0

В примерах Google Superclass в FIRST в 'onRestoreInstanceState, onStop, onRestart, onStart'. –

+0

@YoushaAleayoub: Это может случиться так, что для этих методов это может быть, но в этом нет никакого языкового правила, и в некоторых случаях вы можете захотеть сделать это * last *. –

+0

Нет, это то, что Проф "Эндрю Т. Са mpbell ", как и Google: http://www.cs.dartmouth.edu/~campbell/cs65/lecture05/lecture05.html –

2

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


Пример 1:

Поставщик этикетки, что экстраполирует время от Date объекта и возвращает его в пользовательский интерфейс для показа:

public class TimeLabelProvider { 
    public String getText(Date element) { 
     //extrapolate time from the element 
     return time; 
    } 
} 

Поставщик ярлык, который экстраполирует как дата и время от объекта Date и возвращает его в пользовательский интерфейс для отображения:

public class DateTimeLabelProvider extends TimeLabelProvider { 
    @Override 
    public String getText(Date element) { 
     //extrapolate date from the element 
     String date = ... 

     //now get time string. We don't need to repeat logic, 
     //its already implemented in super method! 
     String time = super.getText(element); 
     return date + " " + time; 
    } 
} 

Пример 2:

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

DropDownField extends TextField extends Field extends AbstractField 

Теперь каждый из классов добавлены некоторые элементы пользовательского интерфейса в этой области, например, добавил меню и маленькую стрелку справа от поля, TextField добавил валидатор, AbstractTextField добавил белый блок написать текст, и т.д ... для утилизации элементов вы должны сделать многоуровневую утилизацию, как это:

public class DropDownField extends TextField { 

    @Override 
    public void dispose() { 
     menu.dispose(); 
     arrow.dispose(); 
     //let text field dispose of its elements 
     super.dispose(); 
    } 
} 
1

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

public void okPressed() 
{ 
    ///Do your work 
    super.okPressed() 
} 
0

Ключевое слово super - это способ вызова поведения родительского класса в специализированном классе.

В конструкторе, вызывая

super(args) 

позволяют выбрать конструктор родительского класса должен быть использован.

В методе вызова

super.parentMethod(args) 

позволяют вызывать поведение родительского класса, даже если текущий класс коррекции parentMethod. Обычно он будет использоваться для добавления некоторой логики до или после родительского класса.

Вызов

super(); 

в методе не будет компилироваться, так как вы использовали конструктор супер синтаксис в методе.

0

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

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

super on resume 
custom on resume 
... 
custom on pause 
super on pause