2012-05-28 2 views
3

Должен ли я вызвать super.xxxx() перед моим пользовательским кодом или после того, как переопределить метод?
Есть ли определенные навыки для определения?Должен ли я вызвать super.xxxx() перед моим пользовательским кодом или после того, как я переопределю метод?

+2

Это зависит от того, какой метод вы нарушаете. – adatapost

ответ

6

Краткие сообщения wer: Это зависит.

Длинный ответ: Вам нужно понять, что делает реализация метода в родительском классе.

  • Бывают случаи, когда супер-метод выполняет некоторую «инициализацию» работы, требуемую для того, чтобы переопределенный метод функционировал плавно. В таких случаях вызов super.myMethod() должен быть первой строкой в ​​методе.
  • В некоторых других случаях реализация метода в родительском классе может быть причиной некоторых операций очистки (или каких-либо финализации). То, когда вам нужно будет позвонить в superпоследней линии в вашей переопределенной реализации.
  • Тогда бывают ситуации, когда порядок не имеет значения, но вы должны вызвать супер-метод, потому что реализация в базовом классе выполняет некоторую операцию, которая необходима; хотя порядок этих операций не имеет значения. Большинство методов жизненного цикла Activity относятся к этой категории. Вот почему вы должны позвонить хотя super.onCreate(), хотя вы можете сделать это в любой момент вашего onCreate().
  • Наконец, есть случаи, когда вызов метода super не требуется. Базовый класс имеет реализацию по умолчанию, которую вы можете использовать или игнорировать. Вы также можете сделать if-else здесь: например, вы можете обратиться к супер-реализации. Если он возвращает null, вы можете создать новый объект и вместо этого вернуть его.

Есть ли определенные навыки для определения?

  • Прочитайте документацию методы и посмотреть, если есть какое-либо упоминание о том порядке, в котором должен быть вызван метод super.
  • Пройдите исходный код базового класса и посмотрите, можете ли вы понять, делает ли он что-либо, что потребовало его вызова в определенном порядке.
+0

+1 ............................. –

0

      (Very OOPy) Как правило, идея состоит в том, чтобы вызвать супер, только когда вам нужна функциональность родителя. Я знаю, это кажется довольно очевидным, но это имеет значение, когда речь идет о функциональности очистки:

Init: 
    super.init 
    ... your initialization code 

Delete: 
    ... your deletion code here <-- important 
    super.delete 

SomeOtherRandomMethod: 
    ... your code may go here if it does not need any state from the parent 
    super.SomeOtherRandomMethod 
    ... otherwise it can go here 

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

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