繁体   English   中英

当我们需要时,在Objective-C中使用协议有什么优势?

[英]what are the advantage of using protocols in Objective-C, when we require them?

当我们需要它们时,在Objective-C中使用协议有什么优势? 我已经阅读了Objective-C编程指南,该指南主要显示3个优点:

  1. 声明期望其他人实现的方法。

  2. 在隐藏对象类的同时声明该对象的接口

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM