Надежные места для вызовов super () в Android Eclipse Plugin? - PullRequest
16 голосов
/ 14 февраля 2011

Во многих методах Android, особенно в конструкторах и переопределенных методах, вы должны или даже должны вызывать метод родительского класса, используя super () .Когда вы используете Eclipse Source> Override / Implement Methods ... , вы получаете код из шаблона с тегами TODO следующим образом:

public MyCanvas(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}


@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub      
    super.onDraw(canvas);
} 

Я не совсем понимаю, что делает суперклассв каждом случае, поэтому я всегда вставляю свой код в точное местоположение тегов // TODO .В этом примере я вызову super () перед моим кодом в конструкторе и после моего кода в onDraw ().

Могу ли я всегда полагаться на эти места вставки кода в сгенерированном коде?Есть ли простое правило / объяснение, когда вызывать super ()?

Ответы [ 3 ]

14 голосов
/ 14 февраля 2011

Это хороший вопрос. К сожалению, не существует простого правила для этого. Вы должны знать, что делает реализация суперкласса. Иногда (как в View.onDraw()) реализация суперкласса ничего не делает; вызов super () безвреден и не нужен. В других случаях (например, Activity.onCreate()) реализация суперкласса выполняет критические операции, которые должны быть выполнены в какой-то момент обработки подкласса. Иногда то, что происходит при вызове super (), должно происходить перед любой обработкой в ​​подклассе, иногда в других точках. Иногда вы хотите полностью заменить обработку суперкласса своей собственной, и в этом случае вы вообще не вызываете super (). У вас есть полная свобода вызывать версию суперкласса в любой точке (или даже в нескольких точках) в логике вашего подкласса.

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

Если в документации недостаточно информации, вам нужно взглянуть на исходный код. Код Android доступен здесь (выпуск Gingerbread). Код API находится под core.

РЕДАКТИРОВАТЬ Код больше не доступен на git.kernel.org. Вот два других места, где вы можете просмотреть код:

Основной код находится в репозитории Платформа> Каркасы> База

3 голосов
/ 14 февраля 2011

Могу ли я всегда полагаться на эти места вставки кода в сгенерированном коде?

Нет, иногда вы не хотите вызывать super.method.Иногда вы хотите позвонить первым, иногда на последнем месте и т. Д. Это зависит.Но я говорю о методах, без конструкторов.

Есть ли простое правило / объяснение, когда вызывать super ()?

Вы всегда должны будете набрать все super, как и предыдущие ответы.Единственный случай, когда вы не вызываете super, это когда конструктор суперкласса не имеет параметров;в этом случае компилятор поставит для вас super.

Я не понимаю точно, что суперкласс делает в каждом случае, поэтому я всегда вставляю свой код в точное местоположение// Теги TODO

Если вы сомневаетесь (я говорю о супер-методах), вы всегда можете взглянуть на исходный код.Google Code Search - хороший ресурс для этого.Затем вы можете решить, помещать ли ваш код до или после метода super;или даже не ставьте метод super вообще.

Имейте в виду, что не добавление метода super допустимо во время компиляции.Но некоторые методы на Android не будут работать, если вы не вызовете метод super (например, метод onResume класса Activity).

Кроме того, иногда вы решаете, запускать ли superметод или нет во время выполнения.Рассмотрим классический пример:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if( KeyEvent.KEYCODE_BACK == event.getKeyCode() ){
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

Если пользователь нажал клавишу возврата, вы не вызовете супер-метод.Если пользователь этого не сделал, вы делегируете работу методу super.

...