为什么要让一个类私有地遵守协议?

时间:2011-11-22 20:40:16

标签: objective-c cocoa-touch protocols class-extensions

我一直在关注Apple的MVCNetworking example projectAppDelegate的界面定义的一部分令我感到困惑。在.h文件中我们有:

@interface AppDelegate : NSObject
{
  ...

但是在.m文件中我们有这个:

@interface AppDelegate () <SetupViewControllerDelegate>
  ...

所以这个类是私有符合协议。但是你为什么要这样做而不是在标题中公开声明呢?

4 个答案:

答案 0 :(得分:5)

一般情况下,您应尽可能少公开曝光。当AppDelegate呈现SetupViewController时,可能会使用AppDelegate可能是SetupViewController的委托这一事实。没有其他类应该将AppDelegate设置为其他一些SetupViewController的委托,因此公开宣传该一致性是没有意义的。

答案 1 :(得分:3)

看起来该实现在其“私有”方法SetupViewController中内部使用了presentSetupViewControllerAnimated:。由于视图控制器不可公开访问(通过属性或其他方式),因此无需从公共角度将类声明为符合协议。换句话说,协议只与类的实现有关,而不与它所呈现的公共接口有关。

答案 2 :(得分:1)

有时您希望成为另一个对象的委托,但这样做可能会产生编译器警告,因为您没有明确声明您的类符合协议所需的方法。正如其他人所提到的,面向对象编程的一个支柱是information hiding。在您的标头中声明一个类实现特定协议是不可取的,因为您将破坏该原则。它还会打开您的类以滥用或以其无意的方式使用它,因为它使其他类知道该信息。通过在.m文件中声明私有类别并让编译器知道您打算实现此协议,您不仅可以消除可能出现的警告,而且实际上是使您的代码自我记录。

答案 3 :(得分:0)

也许是因为除了你自己,你不希望任何人知道你的协议。因此,AppDelegate外部的任何人都不会将Appdelegate的实例作为委托传递给另一个类实例。所以你可以在内部传递它。