2013-05-29 59 views
7

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

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

谢谢!

回答

6

您定义协议方式,使你的代码可以调用由他人实现的方法。你和实施你的方案开发人员之间的“契约”是这样的:

  • 定义协议,
  • 别人实现你的协议,
  • 别人创建实施对象你的协议,并将其提供给你,所以
  • 可以叫你的协议的方法,不知道它们的实现。

为了调用协议的方法,您需要有一个实现它的对象实例。定义协议的关键在于从代码中删除有关实现协议的类的任何知识:如果您知道将要获得哪个类,那么您可以跳过该协议,并直接编程到该类。但是,如果你想打电话给你的init,你必须要么知道类或其他人必须通过你在其上init还没有被称为又一个alloc -ed对象。两种替代方案都不是一个好主意 - 第一种方法是杀死协议的目的,第二种方法是调用者在部分初始化对象中处理。

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

+0

莫非,这是一个正常的做法,如果不是**别人**创建实现接口的对象,但** **你? – SeriousBob

+0

@SeriousBob如果你创建了这个对象,那么你就知道它的类型,以及它实现的所有协议。在这种情况下,知道'init'(或者其他任何方法)是协议的一部分就不再需要了。 – dasblinkenlight

+0

好吧,为什么NSCoding协议有一个initWithCoder:方法? – SeriousBob

3

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