昨天我的同事问我,为什么我们不应该在协议中声明一个init方法(initWith...:(...)),以强制实现类提供这样一个初始化器。我对这个问题感到非常惊讶,在我的理解中,这是无意义的。但我找不到一个明确的理由,只知道在协议中声明一个init方法会导致实现方的灵活性降低。
请问您能否给出一个好的理由,为什么应该或者不应该在协议中声明一个init方法?
谢谢!
请问您能否给出一个好的理由,为什么应该或者不应该在协议中声明一个init方法?
谢谢!
init
, 你必须要么知道类,要么其他人必须给你一个没有调用init
的alloc
的对象。两种选择都不好 - 第一种选择破坏了拥有协议的目的,第二种选择强制你的调用者处理部分初始化的对象。
请注意,这并不妨碍你在协议中拥有非init
配置方法: 如果所有对象必须使用某些信息进行配置,请让你的用户实现任何想要的init
,并向你的协议添加一个configureWith:...
方法,让你控制配置对象的过程而不知道它的init
方法。我知道iOS SDK中有一些协议具有init...方法。例如,NSCoding协议具有必需的-initWithCoder:方法。我认为这是正常的做法。
init
(或其他任何方法)是协议的一部分。 - Sergey KalinichenkoNSCoding
是一个非常特殊的情况:它被设计用于支持归档(在其他框架中也称为“序列化”),因此它在协议中定义了一个init
方法。实例通过一些反射魔法创建,然后调用initWithCoder:
方法。其他语言中的框架要求可序列化的类提供一个无参数的构造函数。 - Sergey Kalinichenko