как я знаю, когда и где вызывать переопределенный метод суперкласса - PullRequest
4 голосов
/ 14 апреля 2010

Этот вопрос возник у меня при программировании приложения для Android, но, похоже, это более общий вопрос программирования.

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

Например, я переопределяю метод "public boolean onCreateOptionsMenu (Menu menu)" из класса "Activity" на платформе Android. И я видел, как кто-то написал «return super.onCreateOptionsMenu (menu)» в конце метода, в качестве примера. Но откуда мне знать, что это нужно сделать таким образом? и это правильно или нет? какая разница, если я начну свой метод с "super.onCreateOptionsMenu (menu)"?

BR, Генри

Ответы [ 6 ]

7 голосов
/ 14 апреля 2010

Не думаю, что вы можете ответить на этот вопрос абстрактно: это зависит от поведения метода суперкласса, который вы переопределяете.

В зависимости от обстоятельств может быть целесообразно:

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

Надеюсь, документация для конкретного класса, который вы переопределяете, сообщит вам, если / когда необходимо вызвать super.

1 голос
/ 15 апреля 2010

Android в большинстве случаев вызовет исключение, если вы забудете вызвать super. Я бы поверил, что вам не нужно звонить супер, если вы не сделаете это, и он не бросит.

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

  • Если вы находитесь в методе создания, как onCreate, onResume и т. д. вызов супер как первое утверждение. Таким образом, вы можете быть уверены, что все, что должно быть подготовлено из суперкласса, подготовлено.
  • Если вы находитесь в закрывающем методе, таком как onSaveInstanceState, onPause вызывает super last. Теперь вы можете быть уверены, что ничего не будет удалено или изменено до плохого состояния, прежде чем вы все сделаете.
1 голос
/ 14 апреля 2010

Это правильные вопросы, но, к сожалению, здесь нет общих правил.

Необходимость вызова метода super зависит от того, выполняет ли метод super то, что нужно сделать. Другими словами: вы расширяете или заменяете переопределенный метод? Хорошая документация по API класса должна дать вам ответ. Кроме того, библиотеки часто следуют некоторым соглашениям, чтобы прояснить, как их использовать.

Ответ на вопрос , где разместить супер-звонок , зависит от того, когда вы хотите выполнить свой добавочный номер. Нужно ли запускать до или после супер-метода? Чаще всего вы сначала звоните супер, а затем делаете что-то дополнительное. Но если вам нужно что-то подготовить для супер-метода, например изменить какое-либо состояние объекта или манипулировать аргументами, вы помещаете код перед супер-вызовом. Опять же, документация по API должна дать вам ответ здесь.

1 голос
/ 14 апреля 2010

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

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

0 голосов
/ 14 апреля 2010

Когда вы переопределяете метод в дочернем классе, это зависит от типа экземпляра, для которого вы вызываете этот метод.

например:

   Class Animal{
        public eat(){
           //..
        }
   }

   Class Dog extends Animal{
        public eat(){
           //..
        }
  }

now if you say new Dog().eat() 
it executes Dog's eat method.

if you say new Animal().eat()
it executes Animal's eat method.

И у вас может быть такой код

       Animal a = new Dog();
       a.eat();

, который снова выполняет метод eat Dog, поскольку фактический экземпляр имеет тип Dog.

0 голосов
/ 14 апреля 2010

Вы не обязаны вызывать super.method (), вы вызываете его только тогда, когда вам это нужно, где вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...