昨天一个同事问,为什么我们不应该声明的init方法(initWith ...(...))在协议以强制执行类提供这样的初始化。我对这个问题感到非常惊讶,根据我的理解,这是无稽之谈。但是我找不到明确的原因,但是在协议中声明init方法会导致实现的灵活性较差。目标C初始化协议中
你能告诉我一个很好的理由,为什么应该或不应该在协议的init方法?
谢谢!
昨天一个同事问,为什么我们不应该声明的init方法(initWith ...(...))在协议以强制执行类提供这样的初始化。我对这个问题感到非常惊讶,根据我的理解,这是无稽之谈。但是我找不到明确的原因,但是在协议中声明init方法会导致实现的灵活性较差。目标C初始化协议中
你能告诉我一个很好的理由,为什么应该或不应该在协议的init方法?
谢谢!
您定义协议方式,使你的代码可以调用由他人实现的方法。你和实施你的方案开发人员之间的“契约”是这样的:
为了调用协议的方法,您需要有一个实现它的对象实例。定义协议的关键在于从代码中删除有关实现协议的类的任何知识:如果您知道将要获得哪个类,那么您可以跳过该协议,并直接编程到该类。但是,如果你想打电话给你的init
,你必须要么知道类或其他人必须通过你在其上init
还没有被称为又一个alloc
-ed对象。两种替代方案都不是一个好主意 - 第一种方法是杀死协议的目的,第二种方法是调用者在部分初始化对象中处理。
注意,它不会阻止您不必在协议非init
配置方法:如果所有对象必须使用某些信息位进行配置,让您的用户实现了他们想要的任何init
,并添加configureWith:...
方法您的协议,让您在不知道其方法的情况下控制配置对象的过程。
我知道一些在iOS SDK中有init ...方法的协议。例如,NSCoding Protocol具有 - initWithCoder:所需的方法。我认为这是正常的做法。
莫非,这是一个正常的做法,如果不是**别人**创建实现接口的对象,但** **你? – SeriousBob
@SeriousBob如果你创建了这个对象,那么你就知道它的类型,以及它实现的所有协议。在这种情况下,知道'init'(或者其他任何方法)是协议的一部分就不再需要了。 – dasblinkenlight
好吧,为什么NSCoding协议有一个initWithCoder:方法? – SeriousBob