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

Iphone 当我们需要协议时,在Objective-C中使用协议的优势是什么?,iphone,Iphone,当我们需要协议时,在Objective-C中使用协议的优势是什么?我已经阅读了objective-C编程指南,它主要显示了3个优点: 声明其他人期望实现的方法 在隐藏对象的类时声明对象的接口 @protocol DatabaseConnection - (QueryResult*) runQuery:(NSString*)query; - (void) close; @end @interface MySQLConnection : NSObject <Database

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

  • 声明其他人期望实现的方法

  • 在隐藏对象的类时声明对象的接口

  • @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];
    }
    
  • 捕捉不具有层次关系的类之间的相似性


  • 有人能解释我(2)和(3)吗?我无法理解,因为我已经在Obj-C编程指南中阅读了它们的详细信息?使用协议还有其他好处吗?您如何描述为什么我们需要Objective-C中的协议?

    它帮助您实现多态性。基本上,一旦建立了协议,实现该协议的任何对象都可以响应特定的方法

    它几乎就像对象的API:一种预期的行为

    如果您有
    emailMe
    协议,则任何支持该协议的对象都将保证采用
    sendToAddress
    。它是什么类型的对象并不重要,只是它可以处理
    emailMe
    消息


    然后,由对象本身将相关内容打包,以便通过电子邮件发送出去。但通过这种方式,您可以拥有一个
    sender
    类,该类可以选择通过电子邮件发送各种对象。所有这些对象都是不同的类并不重要,只是它们支持协议
    emailMe

    它帮助您实现
    多态性。基本上,一旦建立了协议,实现该协议的任何对象都可以响应特定的方法

    它几乎就像对象的API:一种预期的行为

    如果您有
    emailMe
    协议,则任何支持该协议的对象都将保证采用
    sendToAddress
    。它是什么类型的对象并不重要,只是它可以处理
    emailMe
    消息

    然后,由对象本身将相关内容打包,以便通过电子邮件发送出去。但通过这种方式,您可以拥有一个
    sender
    类,该类可以选择通过电子邮件发送各种对象。所有这些对象都是不同的类并不重要,只是它们支持协议
    emailMe

    3)您可以实现类似的功能(通过响应同一组消息)(如1所示),而无需直接对另一个相同的类进行子类化

    例如,您有一个类Something1,它实现了您想要在Something2中实现的一些功能。您不能将某个东西子类化1,因为您已经是视图控制器的子类,例如。通过使用协议,您可以将它们链接起来,而不需要层次关系(一个是另一个的子类)

    我自己也不太了解2,所以如果其他人能够解释这一点……

    3)您可以实现类似的功能(通过响应同一组消息)(如1所示),而无需直接对另一个相同的类进行子类化

    例如,您有一个类Something1,它实现了您想要在Something2中实现的一些功能。您不能将某个东西子类化1,因为您已经是视图控制器的子类,例如。通过使用协议,您可以将它们链接起来,而不需要层次关系(一个是另一个的子类)

    我自己也不太懂2,所以如果有人能解释一下…

    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];
    }
    
    您可能还想知道它的超类是什么

    - (Class)superclass;
    
    也许你想问两个物体是否相等

    - (BOOL)isEqual:(id)object;
    
    所有这些以及更多的方法都是您可能希望在诸如File、MySQLConnection、User、MonsterX、MiniGun之类的类上使用的方法。虽然这些类与继承的观点完全不同,这也是它们不能共享基类的原因,但协议解决了这一需要

    例如,Objective-C有一个名为的基本协议

    注意:有些人会指出,大多数Objective-C类都是从继承而来的,并且它们从中获得了许多这样的方法

    这句话是真的。而
    NSObject
    类,实现了
    NSObject
    协议。Apple认识到,在某些情况下,您的对象不从类继承,但可能仍然希望提供服务,例如响应
    描述
    方法。

    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];
    }
    
    您可能还想知道它的超类是什么

    - (Class)superclass;
    
    也许你想问两个物体是否相等

    - (BOOL)isEqual:(id)object;
    
    所有这些以及更多的方法都是您可能希望在诸如File、MySQLConnection、User、MonsterX、MiniGun之类的类上使用的方法。虽然这些类与继承的观点完全不同,这也是它们不能共享基类的原因,但协议解决了这一需要

    例如,Objective-C有一个名为的基本协议

    注意:有些人会指出,大多数Objective-C类都是从继承而来的,并且它们从中获得了许多这样的方法


    这句话是真的。而
    NSObject
    类,实现了
    NSObject
    协议。苹果认识到,有些情况下,您的对象不是从类继承的,但可能仍然希望提供服务,例如响应
    描述
    方法。

    嗨,Alex,谢谢您的回复。但我有一个问题:除此之外,我还可以用抽象类来代替协议。我不知道具体情况,但我认为不能像继承抽象类那样继承主基对象?我认为该协议允许您仍然使用继承,以及通过协议订阅一组合同保证的方法(或多组方法)。T