2016-07-31 5 views
7

Мои коллеги иногда называют super при переопределении метода ios, а иногда и нет. Это, по-видимому, в основном основано на их опыте. Есть ли правило для использования при принятии решения о вызове супер?Когда использовать супер при переопределении методов ios

Пример:

// Has super 
override func awakeFromNib() { 
    super.awakeFromNib() 
} 

// No super 
override func drawRect(rect: CGRect) { 
} 
+2

Правило большого пальца - «читать документы». – matt

+1

@matt Ваш комментарий никому не помогает, просьба указать ссылку на документы или другое сообщение SO. https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-ID196 – alexisSchreier

+0

@alexisSchreier Я не согласен. Я ответил на вопрос очень прямо, кратко и правильно. Чтобы узнать, следует ли назвать super при реализации 'awakeFromNib', вам нужно прочитать документы на' awakeFromNib'. И так далее. Нет более короткого пути. Мой комментарий помогает _everybody_. – matt

ответ

5

На самом деле нет правильного правила для того, следует ли вам назвать супер-реализацию данного метода. Это то, что должно определяться в каждом конкретном случае, в зависимости от рекомендаций из документации для внедрения этого метода суперкласса и ваших требований.

Просто объяснить, почему два примера вы включили бы так, как они есть, мы можем смотреть на документацию для -[UIView drawRect:], которая гласит:

Если подкласс UIView непосредственно, ваше реализацию этого метода не нужно называть супер. Однако, если вы подклассифицируете класс вида , вы должны вызвать супер в какой-то момент в своей реализации .

и документация -[NSObject awakeFromNib], которая гласит:

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

В большинстве случаев это, вероятно, безопасная ставка на то, что вы должны назвать супер реализацию метода (см. Комментарии ниже). Однако, будьте осторожны, некоторые методы требуют, чтобы вы назвали их супер-реализацию, некоторые - нет, а некоторые даже требуют, чтобы вы вызывали супер-реализацию в определенный момент вашего переопределения. Поэтому помните, когда вы сомневаетесь, всегда обращайтесь к документации.

+3

Я бы ответил на это по-другому. Для начинающих разработчиков я бы сказал: «Всегда называйте супер-реализацию». Если компилятор жалуется, что метод не определен, удалите вызов. Иногда вам не нужно называть супер, потому что супер-реализация базового класса ничего не делает, но безопаснее называть его, когда вам это не нужно, чем не называть его, когда вам нужно. –

+1

@ DuncanC Это хороший момент. Призыв супер, если у вас есть сомнения, вероятно, более безопасная позиция по умолчанию для принятия в общем случае. Хотя (и я не могу придумать пример), это может быть так, что супер-реализация метода имеет побочные эффекты, которые изменяют состояние, которое также изменил код в реализации вашего подкласса. В этом случае размещение супервызова в вашем переопределении имеет значение и может привести к дальнейшему путанице. –

+2

Я считаю, что норма должна сначала вызвать супер-версию, а затем добавить свой собственный код. Таким образом, любые изменения, внесенные вами в метод, применяются после того, как супер-реализация выполняет свою задачу. –

0

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

+1

«Если вы переопределяете метод, вы должны называть супер». Это не так - это зависит от конкретного метода, если он нужен или нет. – Gruntcakes

+0

Да, например ['UIViewController loadView'] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/loadView) прямо говорит: «Ваша пользовательская реализация этого метода не должна быть вызвана супер». Мой совет всегда проверяет документацию и когда сомневаюсь, вызовите super по умолчанию, если документация не говорит.Одна хорошая вещь об Android против iOS - у вас есть исходный код и вы можете посмотреть, что на самом деле делает супер. : -/ –

+0

@i_am_jorf Я не вижу этого нигде в этой ссылке документа. –

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