Каковы основные причины использования @protocols в Objective C?
Почему я хотел бы использовать протокол, а не создавать подкласс и наследовать методы..?
Пожалуйста, объясните мне, я запутался в этой теме, мне не очень нравится объяснение в книге, которую я читаю.
Где я могу использовать протоколы вместо других способов получить методы..? если я могу создать подкласс класса и получить методы, почему я хочу использовать протокол, где мне нужно определить методы?
3 ответа
Почему я хотел бы использовать протокол, а не создавать подкласс и наследовать методы..?
Протоколы позволяют всем несвязанным классам реализовывать один и тот же интерфейс. Экземпляры каждого из этих классов могут затем использоваться клиентом протокола. Например, UITableViewDataSource
это протокол, который обеспечивает интерфейс, с помощью которого таблица может запрашивать данные у любого объекта, который реализует протокол. Табличное представление не заботится о том, какой тип объекта, пока оно реализует интерфейс источника данных.
Представьте себе, как неприятно было бы, если бы все источники табличных данных должны были наследоваться от общего класса! Objective-C обеспечивает только одно наследование, поэтому вы фактически будете вынуждены использовать только один тип объекта для своего источника данных. Однако в случае протоколов источником данных может быть контроллер представления, объект модели или, возможно, даже удаленный объект.
Чтобы быть более конкретным, протоколы допускают форму полиморфизма. Это означает, что один объект может принимать несколько форм: например, контроллер представления, источник данных таблицы, делегат таблицы, делегат представления прокрутки. Поскольку Objective-C является языком с одним наследованием, вы получаете только один из этих интерфейсов через наследование. Остальное вы реализуете сами, но это часто имеет смысл, потому что вы, как правило, применяете данный протокол, чтобы в любом случае настроить поведение некоторых других объектов.
Потому что подклассы и протоколы - это две разные вещи. Создание подклассов расширяет класс новыми функциональными возможностями, в то же время наследуя все предыдущие функциональные возможности определенного класса, в то время как протокол, когда применяется к классу, просто добавляет к нему функциональные возможности и ничего от него не наследует; что этот класс обычно не имеет значения.
Протоколы чаще всего используются для шаблона делегата в Objective-C, в результате чего объект может отправить сообщение другому объекту, не заботясь о том, ЧЕМ является этот объект (т. Е. Его класс).
Часто делегат объявляется как:
@property(nonatomic, assign) id < MyObjectDelegate > delegate;
Обратите внимание, что класс свойства id
- по сути, вам все равно, является ли объект автомобилем или черепахой - все, что вам нужно знать, это то, что это объект (id
) и что он по контракту подписывается на те функции, которые вам нужны. Так что, если ваш делегат типа turtle
, вы можете вызвать [делегировать myStateChanged]; или, если ваш делегат - автомобиль, вы можете вызвать [делегировать myStateChanged]. Все, что вам нужно знать, это то, что, если вы отправите ему сообщение, оно примет его.
Я бы посмотрел и прочитал об использовании делегатов Objective-C, так как думаю, что это действительно поможет вам лучше понять протоколы и чем они отличаются от подклассов. Я не знаю, знакомы ли вы с другими объектно-ориентированными языками программирования, но если это так, протоколы больше всего похожи на интерфейсы в других языках.
Протоколы полезны, потому что вы можете реализовать много протоколов, вместо этого вы можете расширить только один класс.