Вопрос по optional, objective-c, protocols – Реальные примеры методов @opional protocol

10

Сейчас я изучаю Objective-C и наткнулся на дополнительные методы в протоколах. Мой фон - C #, и я вижу протокол как нечто похожее на интерфейс C #.

Если интерфейс C # представляет контракт, объявляя интерфейс, вы заявляете, что будете реализовывать определенные методы.

Имея это в виду, я смущен, почему вам когда-либо понадобится определить необязательный метод. Это не грязь или попытка уменьшить Objective-C, я люблю Objective-C. Я просто хочу понять преимущества этих дополнительных методов, чтобы лучше понять язык.

Я был бы очень признателен, если бы кто-то мог предоставить некоторые реальные сценарии (с примером кода), где необязательные методы полезны.

Ваш Ответ

1   ответ
14

которые общаются с Flickr API. Один, называетсяFKAccount может делать много вещей, связанных с учетной записью пользователя Flickr, включая загрузку фотографий пользователя, получение их списка контактов и так далее.

FKAccount класс определяет протокол делегатаFKAccountDelegate, Этот протокол определяет несколько методов обратного вызова, которыеFKAccount вызовет своего делегата в зависимости от успеха или неудачи различных сетевых операций Flickr. Не каждое приложение, которое используетFKAccount будет заинтересован в каждой операции Flickr, котораяFKAccount может выполнять.

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

FKAccount класс проверяет, отвечает ли его делегат@optional методы в протоколе:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
    [self.delegate accountDidDownloadContacts: self];
}
Я думаю, что я понимаю это сейчас. Интерфейс C # - это только один аспект протокола Objective C. Вы можете использовать протокол в качестве контракта, но эти необязательные методы составляют список необязательных делегатов, на которые объект может также ответить. Это действительно интересно. kim3er
+1 за использование протокола для документирования делегированных функций
Я полностью согласен с @Tom. До Objective-C 2.0 методы делегата обычно объявлялись в категории NSObject, чтобы любой класс, желающий быть делегатом, не нуждался в реализации всех методов. Необязательные методы в протоколах - это гораздо более чистое решение, которое не привязывает тонны методов к NSObject и помогает избежать конфликтов методов. Если бы только Java имела дополнительные методы интерфейса, не было бы необходимости в таких вещах, как наследование от MouseAdapter. Использование таких классов, как правило, несколько раз, когда я проклинал одиночное наследование ... :-)

Похожие вопросы