【发布时间】:2010-03-06 16:47:26
【问题描述】:
Objective c 接口可以有多个实现吗?示例我可以有一个接口,但有 2 个实现,一个是我使用数组,另一个是我使用堆栈..etc 来实现它。
如果是这样,你怎么称呼它/语法?
【问题讨论】:
-
如何使用“协议”?它更接近 java/c# 接口。这就是我想要的?
标签: iphone objective-c interface
Objective c 接口可以有多个实现吗?示例我可以有一个接口,但有 2 个实现,一个是我使用数组,另一个是我使用堆栈..etc 来实现它。
如果是这样,你怎么称呼它/语法?
【问题讨论】:
标签: iphone objective-c interface
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
SomeClass 或AnotherClass 的实例都声称它们提供了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 可以包含 SomeClass 或 AnotherClass 对象。
【讨论】:
也许你应该试试名为Class Cluster 的Cocoa 模式。要开始使用它,您需要创建名为SomeClass 的公共类和两个私有子类SomeArrayClass 和SomeStackClass。当您需要使用堆栈时,您的公共类构造函数将创建 SomeStackClass 的实例并将其作为 SomeClass 的公开可用实例返回。
【讨论】:
(如果你给这个投票,请给 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 上实现返回子类实例的工厂方法。
【讨论】:
你的意思是这样的:
@interface MasterViewController :
UIViewController <GKPeerPickerControllerDelegate,
GKSessionDelegate,
UITextFieldDelegate,
UITableViewDelegate,
AVAudioRecorderDelegate> {
}
【讨论】: