协议的必要性是抽象出与层次无关的类的方法。
类似的东西也可以通过包含所有这些方法并将它们子类化的类(接口)来完成? (由于多重继承问题,这实际上是不可能的,因为必须从NSObject.Nore NSProxy案例派生类)
协议可以做什么比一个类更特殊的事情?
协议是否只试图解决多重继承问题?
答案 0 :(得分:4)
协议的主要优点是,它们描述了对象应该能够做什么,而不强制执行子类化。在没有多重继承的语言中,如果您希望其他程序员能够使用您的类,则需要这样的机制。 (见delegation)
对于Java有something similar, called interfaces.
的实例这意味着一个巨大的优势,因为构建动态系统非常容易,因为我可以允许其他开发人员通过明确定义的协议来增强我的类。
一个实际例子:
我只是在设计一个REST API,我正在提供一个Objective-C客户端库
由于我的api需要有关用户的信息,我添加了一个协议
@protocol VSAPIClientUser <NSObject>
-(NSString *)lastName;
-(NSString *)firstName;
-(NSString *)uuid;
@end
我需要这个用户信息,我将有一个基本的id-object,必须符合这个协议
-(void)addUserWithAttributes:(id<VSAPIClientUser>)user;
您可以将此行理解为:“我不在乎,您在此处提供的是哪种对象,只要它知道lastName
,firstName
和uuid
”。所以我不知道,该对象的其余部分是什么样的 - 我不在乎。
作为图书馆作者,我可以安全地使用它:
NSDictionary *userAttributes = @{@"last_name" : [user lastName],
@"first_name": [user firstName],
@"uuid": [user uuid]};
“[...]如果我今天重新审视这个决定,我甚至可能会删除单一继承。继承并不是那么重要。封装是OOP的持久贡献。“ - Brad Cox被问到,为什么Objective-C没有多重继承。 (编程大师:与主要编程语言创建者的对话,第259页)
答案 1 :(得分:1)
作为替代观点......
面向对象编程的最基本价值来自于能够直接模拟真实世界关系,而不是将它们转换为抽象和模糊等效的计算机世界结构。无论语言要求您以不同于用于描述问题的方式来思考解决方案的实现,它都是有缺陷的OOP工具。 (请注意,我没有说'无用'。:))
真实世界对象具有依赖于上下文的各种角色。这些角色可以拥有状态。因此,我同意缺乏多重继承是易于建模的障碍。 Objective-C协议,Java接口以及您希望组合继承的声明都是对OOP优势的基本部分的否定。
答案 2 :(得分:0)
C ++抽象类的许多用途之一是在其他用途中定义接口(以指定可重用的契约)。然而,还有其他编程语言,例如Objective C,在这个意义上对接口有一个单独的概念;在Objective C中,它被称为协议。
广泛使用这种结构确实需要一种方法将一个以上的合同附加到一个物体上;如果允许这样的接口彼此继承,那么这必须是多重继承才有用。
但是,这与类之间的多重继承不同。
协议不是试图解决多重继承问题。他们试图将合同规范与对象(数据+代码)规范分开。它们实际上可以比一个类更少(如果忽略多重继承方面),这就是为什么它们作为一个单独的概念存在。
实现协议通常比从类继承更少限制(更安全)的主张。