[英]what are the advantage of using protocols in Objective-C, when we require them?
当我们需要它们时,在Objective-C中使用协议有什么优势? 我已经阅读了Objective-C编程指南,该指南主要显示3个优点:
声明期望其他人实现的方法。
在隐藏对象类的同时声明该对象的接口
捕获没有层次关系的类之间的相似性。
谁能解释我(2)和(3),因为我已经在《 Obj-C编程指南》中阅读了它们的详细信息,所以我无法理解它? 使用协议还有其他优点吗? 您如何描述为什么我们需要Objective-C中的协议?
2)在隐藏对象类的同时声明其接口
@protocol DatabaseConnection
- (QueryResult*) runQuery:(NSString*)query;
- (void) close;
@end
@interface MySQLConnection : NSObject <DatabaseConnection> {
...
}
@interface OracleConnection : NSObject <DatabaseConnection> {
...
}
// imagine a method on some class that will give you a connection
- (DatabaseConnection*) getConnection {
// some logic to determine which connection to return
if (something)
return [[[OracleConnection alloc] init] autorelease];
else
return [[[MySQLConnection alloc] init] autorelease];
}
并且您在客户端代码中像这样使用它...
id <DatabaseConnection> con = [SomeClass getConnection];
QueryResult* result = [con runQuery:@"select * from users"];
[con close];
请注意,我们是如何从实际的数据库实现中抽象出来的,并且无论我们正在使用哪个数据库,都可以运行查询。
将DatabaseConnection
定义为协议而不是基类的优点是,我们不必提供默认的实现。 因为在这种情况下,默认实现没有意义。 协议是Objective-C在C ++中完成纯抽象基类或在Java中实现接口的方式。
3)捕获没有层次关系的类之间的相似性。
您可能希望能够询问任何对象有关其实现哪个类的信息。
- (Class)class;
您可能还想知道它的超类是什么。
- (Class)superclass;
也许您想问两个对象是否相等。
- (BOOL)isEqual:(id)object;
所有这些以及更多的东西是您可能需要的诸如File,MySQLConnection,User,MonsterX,MiniGun之类的方法。 尽管从继承的角度来看,这些类完全不同,这就是为什么它们不能共享基类的原因,但是协议可以满足这一需求。
例如,Objective-C有一个称为NSObject的基本协议。
注意:会有人指出,大多数Objective-C类都是从NSObject类继承的,并且从那里可以得到许多这样的方法。
这句话是真的。 但是NSObject
是类,实现NSObject
的协议。 Apple认识到在某些情况下您的对象不会从NSObject
继承该类,但可能仍想提供诸如响应description
方法之类的服务。
它可以帮助您实现polymorphism
。 基本上,一旦建立了协议,实现该协议的任何对象都可以回答特定的方法。
几乎就像对象的API:预期的行为。
如果您有emailMe
协议,则支持该协议的任何对象都可以保证采用sendToAddress
。 它是什么类型的对象都没有关系,只是它可以处理emailMe
消息。
然后,由对象本身来包装自身的相关内容以通过电子邮件发送出去。 但是通过这种方式,您可以拥有一个sender
类别,可以选择通过电子邮件发送各种对象。 所有这些对象都是不同的类并不重要,只要它们支持协议emailMe
。
3)您可以实现类似的功能(通过响应相同的消息集)(如1中所示),而无需直接子类化另一个相同的类。
例如,您拥有Class Something1类,该类实现了Something2中所需的某些功能。 您不能将Something1子类化,因为您已经是视图控制器的子类。 通过使用协议,您可以链接它们而无需它们在层次上相关(一个是另一个的子类)。
我本人不太了解2,所以如果有人可以阐明这一点...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.