Должен ли я вызвать super.xxxx() перед моим пользовательским кодом или после того, как переопределить метод?
Есть ли определенные навыки для определения?Должен ли я вызвать super.xxxx() перед моим пользовательским кодом или после того, как я переопределю метод?
ответ
Краткие сообщения wer: Это зависит.
Длинный ответ: Вам нужно понять, что делает реализация метода в родительском классе.
- Бывают случаи, когда супер-метод выполняет некоторую «инициализацию» работы, требуемую для того, чтобы переопределенный метод функционировал плавно. В таких случаях вызов
super.myMethod()
должен быть первой строкой в методе. - В некоторых других случаях реализация метода в родительском классе может быть причиной некоторых операций очистки (или каких-либо финализации). То, когда вам нужно будет позвонить в
super
последней линии в вашей переопределенной реализации. - Тогда бывают ситуации, когда порядок не имеет значения, но вы должны вызвать супер-метод, потому что реализация в базовом классе выполняет некоторую операцию, которая необходима; хотя порядок этих операций не имеет значения. Большинство методов жизненного цикла
Activity
относятся к этой категории. Вот почему вы должны позвонить хотяsuper.onCreate()
, хотя вы можете сделать это в любой момент вашегоonCreate()
. - Наконец, есть случаи, когда вызов метода super не требуется. Базовый класс имеет реализацию по умолчанию, которую вы можете использовать или игнорировать. Вы также можете сделать if-else здесь: например, вы можете обратиться к супер-реализации. Если он возвращает
null
, вы можете создать новый объект и вместо этого вернуть его.
Есть ли определенные навыки для определения?
- Прочитайте документацию методы и посмотреть, если есть какое-либо упоминание о том порядке, в котором должен быть вызван метод
super
. - Пройдите исходный код базового класса и посмотрите, можете ли вы понять, делает ли он что-либо, что потребовало его вызова в определенном порядке.
+1 ............................. –
(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 код в начале переопределения (если нет некоторые действительно по какой-то причине), и просто убедитесь, что я вызываю уничтожение/удаление/освобождение/уничтожение родителя. после. Я сделал свою собственную очистку (мы определенно не хотим, чтобы родительский объект выгружал объект из под нами!)
- 1. Должен ли я вызвать Dispose после того, как я закончил с моим файловым потоком
- 2. Должен ли я вызвать IsDialogMessage() перед TranslateAccelerator()
- 3. Что произойдет, если я переопределю метод window.scrollTo?
- 4. Могу ли я вызвать метод перед конструктором
- 5. Должен ли я вызвать VariantClear после VariantChangeType
- 6. Должен ли я вызвать Стоп перед чтением ElapsedMilliseconds?
- 7. Должен ли я вызвать clearTimeout перед перезаписью переменной тайм-аута?
- 8. Должен ли я закрыть подготовленное заявление до или после того, как я использовал результат в PHP
- 9. Должен ли я вызвать removeEventListener перед удалением элементов DOM?
- 10. Должен ли я вызвать addSubview после вызова addChildViewController?
- 11. Должен ли я вызвать SaveOrUpdate() после вызова Merge()?
- 12. Могу ли я вызвать метод после вызова каждого метода @RequestMapping?
- 13. Должен ли я использовать Stream.Flush перед Stream.CopyTo?
- 14. Должен ли я вызвать метод заданной длины в самом методе?
- 15. Должен ли я изучать рекурсию перед ООП?
- 16. Должен ли я вызвать метод Release() для объектов CComPtr?
- 17. Должен ли я вызвать layoutIfNeeded внутри viewDidLayoutSubviews()
- 18. Какую лицензию программного обеспечения я должен отпустить под моим кодом?
- 19. php - Должен ли я вызвать exit() после вызова заголовка Location:?
- 20. Должен ли я вызвать функцию Dispose() в функции после возврата?
- 21. Должен ли я вызвать внутри элемента управления?
- 22. Icon.FromHandle: должен ли я утилизировать его или вызвать DestroyIcon?
- 23. Должен ли метод вызвать получение данных перед циклом foreach?
- 24. Должен ли я вызвать jQuery.off после удаления элемента DOM?
- 25. ReactJS - Должен ли я использовать метод класса или внешнюю функцию
- 26. Должен ли я отправлять сохранение или авторекламу перед возвратом объектов?
- 27. Должен ли я вызвать Entity Framework SaveChanges один или один раз после каждого изменения
- 28. Должен ли я ждать изменения, чтобы вызвать resize2fs после того, как mdadm raid 5 вырастет?
- 29. Должен ли я вызвать Looper.prepare() в потоке?
- 30. Должен ли я вызвать close() на URLLoader после ошибки?
Это зависит от того, какой метод вы нарушаете. – adatapost