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