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)
其中一个SomeClass或AnotherClass两个的实例声称它们提供了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和两个私人子SomeArrayClass和SomeStackClass.当您需要使用堆栈时,您的公共类构造函数将创建实例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上实现返回子类实例的工厂方法.
| 归档时间: |
|
| 查看次数: |
13980 次 |
| 最近记录: |