Подтвердить что ты не робот

Делегирование против протокола

Возможный дубликат:
Разница между протоколом и делегатами?

Есть ли разница между протоколом и делегатами?

Если они одинаковы, зачем нам делать то же самое?

Когда использовать делегат и когда использовать протокол.

Я новичок в программировании Objective-C и Iphone. Поэтому, пожалуйста, медведь со мной.

4b9b3361

Ответ 1

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

Делегат - это более абстрактный термин, который относится к Designation Design Patten. Используя этот шаблон проектирования, класс будет иметь определенные операции, которые он делегирует (возможно, необязательно). Это создает альтернативу подклассу, позволяя обрабатывать конкретные задачи в зависимости от приложения, которые будут реализованы делегатом.

Это связанные термины, потому что вы часто видите Протокол, созданный для делегирования. Если я хочу разрешить делегату что-то сортировать, я бы создал протокол с указанным необходимым методом, например "sortMyCoolStuff:..", и я бы потребовал делегата для его реализации. Таким образом, в классе, который поддерживает вызов делегату, я могу принять указатель на делегат, а затем сказать "если этот делегат соответствует myCoolProtocol, я знаю, что он реализует sortMyCoolStuff, поэтому безопасно вызывать этот метод вместо того, чтобы делать мои встроенные в поведении"

Ответ 2

Протоколы и делегаты - это две связанные, но разные концепции:

С одной стороны, протоколы объявляют методы, которые могут быть реализованы любым классом. Говорят, что эти классы соответствуют протоколу. Они похожи на интерфейсы на Java. Протоколы могут быть формальными или неофициальными:

  • Формальные протоколы объявляются блоком @protocol.

  • Неофициальные протоколы могут быть реализованы в терминах блока @protocol со всеми методами @optional или с категорией NSObject.

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

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