我一直在关注Apple的MVCNetworking example project,AppDelegate
的界面定义的一部分令我感到困惑。在.h文件中我们有:
@interface AppDelegate : NSObject
{
...
但是在.m文件中我们有这个:
@interface AppDelegate () <SetupViewControllerDelegate>
...
所以这个类是私有符合协议。但是你为什么要这样做而不是在标题中公开声明呢?
答案 0 :(得分:5)
一般情况下,您应尽可能少公开曝光。当AppDelegate呈现SetupViewController时,可能会使用AppDelegate可能是SetupViewController的委托这一事实。没有其他类应该将AppDelegate设置为其他一些SetupViewController的委托,因此公开宣传该一致性是没有意义的。
答案 1 :(得分:3)
看起来该实现在其“私有”方法SetupViewController
中内部使用了presentSetupViewControllerAnimated:
。由于视图控制器不可公开访问(通过属性或其他方式),因此无需从公共角度将类声明为符合协议。换句话说,协议只与类的实现有关,而不与它所呈现的公共接口有关。
答案 2 :(得分:1)
有时您希望成为另一个对象的委托,但这样做可能会产生编译器警告,因为您没有明确声明您的类符合协议所需的方法。正如其他人所提到的,面向对象编程的一个支柱是information hiding。在您的标头中声明一个类实现特定协议是不可取的,因为您将破坏该原则。它还会打开您的类以滥用或以其无意的方式使用它,因为它使其他类知道该信息。通过在.m文件中声明私有类别并让编译器知道您打算实现此协议,您不仅可以消除可能出现的警告,而且实际上是使您的代码自我记录。
答案 3 :(得分:0)
也许是因为除了你自己,你不希望任何人知道你的协议。因此,AppDelegate外部的任何人都不会将Appdelegate的实例作为委托传递给另一个类实例。所以你可以在内部传递它。