7

昨天一位同事问,为什么我们不应该在协议中声明一个 init 方法(initWith...:(...))来强制实现类提供这样的初始化程序。我对这个问题感到非常惊讶,在我的理解中,这是无稽之谈。但我找不到明确的原因,但在协议中声明 init 方法会导致实现的灵活性降低。

你能否告诉我一个很好的理由,为什么协议中应该或不应该有一个 init 方法?

谢谢!

4

2 回答 2

8

您在协议中定义方法,以便您的代码可以调用其他人实现的方法。您和实现您的协议的开发人员之间的“合同”如下所示:

  • 定义协议,
  • 其他人实现了你的协议,
  • 其他人创建了一个实现您的协议的对象,并将其提供给您,所以
  • 可以在不知道其实现的情况下调用协议的方法。

为了调用你的协议的方法,你需要一个对象的实例来实现它。定义协议的重点是从你的代码中删除任何关于实现你的协议的类的知识:如果你知道你将获得哪个类,你最好跳过协议,直接对类进行编程。但是,如果您想调用您的init,您必须知道该类,或者其他人必须向您传递一个尚未调用的alloc-ed 对象。init这两种选择都不是一个好主意——第一个扼杀了协议的目的,第二个迫使你的调用者处理部分初始化的对象。

请注意,它不会阻止您init在协议中使用非配置方法:如果必须使用某些信息来配置所有对象,让您的用户实现init他们想要的任何东西,configureWith:...并向您的协议添加一个方法,让您控制在不知道其init方法的情况下配置对象的过程。

于 2013-05-29T09:38:55.537 回答
4

我知道 iOS SDK 中的一些协议具有 init... 方法。例如 NSCoding 协议有 -initWithCoder: 必需的方法。我认为这是正常的做法。

于 2013-05-29T09:37:44.630 回答