Цель-c - Назначение категорий и протоколов - PullRequest
5 голосов
/ 18 июня 2011

Я читал о протоколах и категориях Objective-c, и оба они кажутся мне довольно бессмысленными. Они оба используются для забавного добавления чего-либо в программу, вместо того, чтобы просто добавлять это вручную.

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

Что касается категорий, я действительно не понимаю, почему вы не просто добавили бы их в код. Зачем вам нужно вручную указывать методы в категории, которую вы затем будете внедрять, а не просто делать это нормально? Может быть, вы хотите сделать «подкласс», но с небольшими изменениями? Почему бы просто не сделать подкласс?

Я действительно не вижу цели ни одного из них, я надеюсь, что кто-то может сказать мне их реальное использование = /

Заранее спасибо, Christian

Ответы [ 5 ]

15 голосов
/ 18 июня 2011

Категории предназначены для добавления методов к классам, источник которых вам недоступен, например, ко всем классам Apple (начинающимся с NS, CG, CA и т. Д.), Без необходимости их подкласса.

Цель протоколов - определить методы, которые должны реализовывать классы, придерживающиеся этого протокола. В Java они называются интерфейсами. Цель состоит в том, чтобы систематизировать сходства между классами, которые не являются братьями и сестрами (подклассы одного и того же суперкласса). Предположим, у вас есть класс Chair и класс Petrol. Они не имеют много общего, за исключением того, что они оба придерживаются протокола flammable, который требует от них определенных методов, таких как specificEnergy и flamingPoint.

Теперь у вашего Fire класса может быть метод addFlammableMaterial:(id <flammable>)material.

Протоколы часто используются для объявления того, что экземпляры определенных классов могут быть делегатами для некоторых других экземпляров. Вы можете объявить свой контроллер представления как источник данных для UITableView, заявив, что он соответствует протоколу UITableViewDataSource, что означает, что ваш viewController гарантирует, что он реализует необходимые методы этого протокола, и tableView может безопасно отдыхать потому что он может доверять ВК как своему источнику данных.

4 голосов
/ 18 июня 2011

A категория - это способ добавления новых методов ко всем экземплярам существующего класса без изменения самого класса.

Для категории прочитайте уже обсуждаемый пост SO,

В чем разница между наследованием и категориями в Objective-C

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

Протоколы часто используются для указания интерфейса для делегированных объектов.

Протоколы объявляют методы, которые могут быть реализованы любым классом.Протоколы полезны по крайней мере в трех ситуациях:

To declare methods that others are expected to implement
To declare the interface to an object while concealing its class
To capture similarities among classes that are not hierarchically related

Подробнее об использовании протоколов.

2 голосов
/ 27 июня 2011

Протоколы - это способ применения контрактного кода к классу, во многом аналогично тому, как работают интерфейсы в Java и C #.

Категории полезны для расширения классов, которые вы не можете напрямую изменить, они очень похожи на методы Extension в C #.

2 голосов
/ 18 июня 2011

Протоколы работают как интерфейсы в Java.Вы можете определить протокол с некоторыми методами, а затем реализовать его во многих классах.Каждый из этих классов может иметь различную реализацию методов, предоставляемых протоколом, но интерфейс будет одинаковым.Например: вы хотите рассчитать зарплату разных типов работников, напр.FullTimeEmployee и ContractEmployee.Вы можете поместить calculateSalary определение метода в протокол и предоставить различные реализации в этих двух классах, например.один будет возвращать фиксированную зарплату, а другой - зарплату в зависимости от рабочего времени.Затем вы можете привести каждый экземпляр класса к типу протокола и вызвать данный метод, получая соответствующие результаты.

Категории полезны, если вы хотите расширить класс, который вам не принадлежит, как в случае встроенных классов, напр.NSString.Вы можете добавить метод типа reverse, чтобы получить обратную строку.Почему бы не сделать подкласс?Потому что вы можете вызывать свой пользовательский метод для измененного класса без приведения ссылки на ваш тип.

1 голос
/ 18 июня 2011

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

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

...