【问题标题】:Can an Objective c interface have more than one implementation?一个Objective c接口可以有多个实现吗?
【发布时间】:2010-03-06 16:47:26
【问题描述】:

Objective c 接口可以有多个实现吗?示例我可以有一个接口,但有 2 个实现,一个是我使用数组,另一个是我使用堆栈..etc 来实现它。

如果是这样,你怎么称呼它/语法?

【问题讨论】:

  • 如何使用“协议”?它更接近 java/c# 接口。这就是我想要的?

标签: iphone objective-c interface


【解决方案1】:

Objective-C 有一个Protocol的概念,它是一个接口的规范。通过协议,Objective-C 完全支持规范的多重继承(但不支持实现)。所以,有点混乱,@interface 语法实际上定义了类(实现),它只支持单继承,但可以指定Protocols的多/多继承的实现,或者接口的规范。最后,这在本质上与 Java 非常相似。

例如:

@protocol SomeInterface
- (void)interfaceMethod1;
- (void)interfaceMethod2;
@end

@interface SomeClass:NSObject <SomeInterface>
@end 

@interface AnotherClass:NSObject <SomeInterface>
@end 

SomeClassAnotherClass 的实例都声称它们提供了SomeInterface协议所需的实现。

Objective-C 是动态类型的,不需要对象实际指定要发送给它的消息。换句话说,您可以在SomeClass 上随意调用任何您想要的方法,无论它是在它的接口 或其任何协议 中指定的还是not(并不是说这一定是一件有成效或积极的事情)。

因此,以下所有内容都将编译(尽管带有警告)并运行良好,尽管在这种情况下,没有实现的消息/方法基本上是无操作的。 Objective-C 有一个相当复杂(而且非常酷)的处理方法调用/转发的过程,这有点超出了这个问题的范围。

SomeClass * someObject = [[SomeClass alloc] init;
[someObject someUnspecifiedMethod];  // Compiles with warning - no op
[someObject interfaceMethod1];

如果您希望定义可以是任何类 (@interface) 类型但实现特定接口 (@protocol) 的东西,则可以使用如下内容:

id <SomeInterface> obj;

obj 可以包含 SomeClassAnotherClass 对象。

【讨论】:

  • 你是对的......我回答了一个更“基本”的问题(并不是真正的 OP 所问的问题)......重新阅读后,我可以看到 OP 可能是寻找更符合您的答案/抽象工厂/类集群的东西。
【解决方案2】:

也许你应该试试名为Class Cluster 的Cocoa 模式。要开始使用它,您需要创建名为SomeClass 的公共类和两个私有子类SomeArrayClassSomeStackClass。当您需要使用堆栈时,您的公共类构造函数将创建 SomeStackClass 的实例并将其作为 SomeClass 的公开可用实例返回。

【讨论】:

  • 这正是您要使用的模式。
  • 如何使用“协议”?它更接近 java/c# 接口。这是我想要的。
【解决方案3】:

(如果你给这个投票,请给 Roman 投票——他的回答是第一,是正确的,只是缺少一个例子)。

您说的是 Class Cluster。例如,查看 NSString 类。

有 NSString:

@interface NSString : NSObject

还有 NSMutableString:

@interface NSMutableString : NSString

两者都在核心类的声明中声明了极少的一组方法。如果你要继承 NSString 来实现你自己的字符串类,你只需要实现那些核心方法NSString 中实现的所有其他方法都是根据这些核心方法实现的。同样,变异方法是使用 NSMutableString 核心中声明的原始方法实现的。

现在,显然,通过- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString(一种核心方法)实现所有可变性将非常低效。因此,在运行时,您会注意到 您实际上从来没有 NSString 或 NSMutableString 的实例,而只有子类的实例(实际上,它们并不是真正的子类......但它们可能是很好地在这个讨论的上下文中)。

而那些子类——运行时使用的实现类——几乎覆盖了 NSString 和 NSMutableString 的所有方法,为特定操作提供高度优化的实现。

所以,你会做这样的事情:

@interface MyAbstractClass : NSObject
... declare factory methods here ...
... declare core methods here ...
@end

@interface MyAbstractClass(AdditionalFunctionality)
... declare convenience here ...
@end

然后,在实现中,将所有核心方法实现为@throw @"Must use subclass",并将所有AdditionalFunctionality方法实现为核心方法。

这可能是完全私有的——根本不在标题中,甚至:

@interface MyStackClass : MyAbstractClass @结束

@implementation MyStackClass ...实现核心方法并覆盖需要优化的附加功能方法... @结束

重复其他类型的课程。然后,根据需要在 MyAbstractClass 上实现返回子类实例的工厂方法。

【讨论】:

    【解决方案4】:

    你的意思是这样的:

    @interface MasterViewController : 
      UIViewController <GKPeerPickerControllerDelegate, 
                        GKSessionDelegate,
                        UITextFieldDelegate,
                        UITableViewDelegate,
                        AVAudioRecorderDelegate> {
    }
    

    【讨论】:

    • 或者你的意思实际上不止一个 @implementation/@end 块?
    • 找到了这种方法来声明多个委托而不创建单独的类和实现。这很好用。谢谢 2 年后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2021-02-03
    • 1970-01-01
    • 2017-05-25
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多