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

时间:2010-03-06 16:47:27

标签: iphone objective-c interface

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

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

4 个答案:

答案 0 :(得分:27)

Objective-C具有协议的概念,它是接口的规范。通过 Protocols ,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上您想要的任何方法,无论是在接口或其任何协议中指定的方法不是(并不是说这必然是一件富有成效或积极的事情)。

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

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

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

id <SomeInterface> obj;

obj可以包含SomeClassAnotherClass对象。

答案 1 :(得分:24)

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

答案 2 :(得分:20)

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

您所说的是 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    @end

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

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

答案 3 :(得分:3)

你的意思是这样的例子:

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