Почему мы иногда вызываем супер в Android?

Иногда, когда я переопределяю методы, я получаю исключение при первом вызове, как показано ниже:

05-31 21:32:04.266: E/AndroidRuntime(28471): android.support.v4.app.SuperNotCalledException: 
Fragment AnalFragment{41795860 #1 id=0x7f070002} did not call through to super.onDestroy()

Почему мы вынуждены звонить super.method()? Имеет смысл, что родительский класс имеет обязательства, но что более важно, откуда мы знаем, что метод требует, чтобы super вызывался, а не ожидал его срыва?

Ответ 1

Почему мы вынуждены называть super.method()?

Классы, составляющие Android SDK, могут быть невероятно сложными. Например, как действия, так и фрагменты должны выполнять ряд операций для правильной работы (т.е. Управления жизненным циклом, оптимизации использования памяти, рисования макета на экране и т.д.). Требование того, чтобы клиент сделал вызов базовому классу (часто в начале метода), гарантирует, что эти операции все еще выполняются, при этом обеспечивая достаточный уровень абстракции для разработчика.

Как мы знаем, что функция требует супервызов?

В документации должно быть указано, требуется ли это. Если это не так, я бы искал Google некоторый пример кода (или проверить демонстрации API... или еще лучше, посмотрите на исходный код!). Это не должно быть слишком сложно понять.

Ответ 2

Я знаю, что это не истинное намерение OP, он задал этот вопрос, и я не верю, что он получил очень хороший ответ, поэтому, если кто-нибудь когда-нибудь задается вопросом: "Почему, черт возьми, я должен позвонить супер?" Если они потребуют этого, почему бы им просто не сделать это для меня!". Вот ответ на эти вопросы....

В принципе, super() - это то, что нужно вызывать, если вы переопределяете то, что ДОЛЖНО быть вызвано, что часто может быть довольно сложным кодом. Теперь, причина, по которой они не просто делают это для вас, и назовут его до того, как ваша функция будет в основном так, что вы будете контролировать!:-D

Чтобы быть более конкретным, вы не можете контролировать, если вы вызываете super(), однако вы можете контролировать КОГДА! Итак, скажем, у вас есть определенный код, который должен произойти до того, как super() вызывается, теперь у вас есть свобода вызова super() только после запуска вашего кода. Или... позвольте сказать, что вам нужно, чтобы super() уже запускался, чтобы ваш код не разбился, теперь у вас есть возможность запускать super() перед запуском вашего кода, следовательно, чтобы все было настроено для вас. Черт, вы даже можете технически переопределить хардкор суперкласса и запрограммировать свой собственный метод, который позаботится о super(), и сделать так, чтобы вам не приходилось называть super(), но 99.9% времени, когда разумные люди не нуждаются сделать это!:-P

Итак, короткий ответ на вопрос "почему мне нужно вызвать super()"... так что вы можете контролировать, когда он вызывает и что-то делать раньше, или после того, как супер() запускается.: -)

Ответ 3

Ключевое слово супер имеет два основных использования

1. Вызывает конструктор суперкласса.

2. Доступ к члену суперкласса, который был скрыт членом подкласса.

Итак, зачем иногда нужно использовать ключевое слово super? Ответ будет андроид под 4GL языком, что означает, что он имеет много функциональности, готовых. Хотя мы переопределяем эти методы для настройки, мы используем ключевое слово super.

см. очень простое использование ключевого слова super в android (как мы это делаем большую часть времени).

@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    .
    .
    .
}

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

Ответ 4

Требование обычно указывается непосредственно в документации API. Например, см. Файл android.widget.ListView.onFinishInflate:

protected void onFinishInflate()

...

Даже если подкласс переопределяет onFinishInflate, они всегда должны быть вызваны супер-методом, так что мы получим вызов.

К сожалению, мой личный опыт в том, что Android-документы неравномерны по качеству. Поэтому я подозреваю, что есть случаи, когда вызов требуется, но не документируется как таковой.