Objective c接口可以有多个实现吗?示例我可以有一个接口,但有两个实现,其中我使用数组或另一个我使用stack..etc来实现它。
如果是这样,你怎么称呼它/语法?
答案 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
SomeClass
或AnotherClass
的实例都声称它们提供了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
可以包含SomeClass
或AnotherClass
对象。
答案 1 :(得分:24)
也许您应该尝试名为Class Cluster的Cocoa模式。要开始使用它,您需要创建名为SomeClass
的公共类和两个私有子类SomeArrayClass
和SomeStackClass
。当您需要使用堆栈时,您的公共类构造函数将创建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> {
}