Objective c接口可以有多个实现吗?

use*_*545 23 iphone interface objective-c

Objective c接口可以有多个实现吗?示例我可以有一个接口,但有两个实现,其中我使用数组或另一个我使用stack..etc来实现它.

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

rcw*_*cw3 27

Objective-C具有协议的概念,它是接口的规范.通过Protocols,Objective-C完全支持规范的多重继承(但不实现).所以,有点令人困惑的是,@ interface语法实际上定义了类(实现),它只支持单继承,但可以指定协议的多/多继承或接口规范的实现.最后,这与Java非常相似.

例如:

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

@interface SomeClass:NSObject <SomeInterface>
@end 

@interface AnotherClass:NSObject <SomeInterface>
@end 
Run Code Online (Sandbox Code Playgroud)

其中一个SomeClassAnotherClass两个的实例声称它们提供了SomeInterface 协议所需的实现.

Objective-C是动态类型的,不要求对象实际指定发送给它的消息.换句话说,你可以肆意地调用任何方法,你想上SomeClass,是否指定,在它的接口或者它的任何协议(不,这必然是做生产或积极的事情).

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

SomeClass * someObject = [[SomeClass alloc] init;
[someObject someUnspecifiedMethod];  // Compiles with warning - no op
[someObject interfaceMethod1];
Run Code Online (Sandbox Code Playgroud)

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

id <SomeInterface> obj;
Run Code Online (Sandbox Code Playgroud)

obj可以持有一个SomeClass或一个AnotherClass对象.


小智 24

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


bbu*_*bum 20

(如果你给这个投票,请给罗马投票 - 他的答案是第一,是正确的,只是缺少一个例子).

你在谈论一个类集群.例如,查看NSString类.

有NSString:

@interface NSString : NSObject
Run Code Online (Sandbox Code Playgroud)

和NSMutableString:

@interface NSMutableString : NSString
Run Code Online (Sandbox Code Playgroud)

两者都在核心类的声明中声明了一组非常小的方法.如果要将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
Run Code Online (Sandbox Code Playgroud)

然后,在实现中,根据核心方法实现所有核心方法@throw @"Must use subclass"和所有AdditionalFunctionality方法.

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

@interface MyStackClass:MyAbstractClass @end

@implementation MyStackClass ...实现核心方法并覆盖需要优化的其他功能方法... @end

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