Почему вы хотите, чтобы класс соответствовал протоколу в частном порядке? - PullRequest
5 голосов
/ 23 ноября 2011

Я смотрел на пример от Apple *1001* Networking *, и часть определения интерфейса для AppDelegate озадачивает меня. В файле .h у нас есть это:

@interface AppDelegate : NSObject
{
  ...

Но в файле .m есть это:

@interface AppDelegate () <SetupViewControllerDelegate>
  ...

Таким образом, этот класс в частном порядке соответствует протоколу. Но почему вы хотите сделать это вместо публичного объявления в заголовке?

Ответы [ 4 ]

5 голосов
/ 23 ноября 2011

В общем, вы должны публично разоблачать как можно меньше.Тот факт, что AppDelegate может быть делегатом SetupViewController, вероятно, используется, когда AppDelegate представляет SetupViewController.Никакой другой класс не должен устанавливать AppDelegate как какой-либо другой делегат SetupViewController, поэтому не имеет смысла публично рекламировать это соответствие.

3 голосов
/ 23 ноября 2011

Похоже, что реализация использует SetupViewController внутри одного из своих "приватных" методов presentSetupViewControllerAnimated:.Поскольку контроллер представления не является общедоступным (через свойство или иным образом), нет необходимости объявлять класс как соответствующий протоколу с публичной точки зрения.Другими словами, протокол связан только с реализацией класса, а не с открытым интерфейсом, который он представляет.

1 голос
/ 23 ноября 2011

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

0 голосов
/ 23 ноября 2011

Может быть, потому что вы не хотите, чтобы кто-то знал о вашем протоколе, кроме вас самих.Так что никто из внешне AppDelegate не передаст экземпляр Appdelegate в качестве делегата другому экземпляру класса.Таким образом, вы сможете передать это внутренне.

...