Objective-C 多重继承
Posted
技术标签:
【中文标题】Objective-C 多重继承【英文标题】:Objective-C multiple inheritance 【发布时间】:2011-05-10 16:24:03 【问题描述】:我有 2 个类,一个包括 methodA,另一个包括 methodB。所以在一个新类中我需要重写方法methodA和methodB。那么如何在Objective C中实现多重继承呢?我对语法有点困惑。
【问题讨论】:
【参考方案1】:这就是我将 singletonPattern 编码为“父级”的方式基本上我使用了协议和类别的组合。
我唯一不能添加的是一个新的“ivar”,但是我可以将它与关联的对象一起推送。
#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end
@interface NSObject (singleton) <BGSuperSingleton>
@end
static NSMutableDictionary * allTheSingletons;
+(instancetype)singleton
return [self singleton1];
+(id) singleton1
NSString* className = NSStringFromClass([self class]);
if (!allTheSingletons)
allTheSingletons = NSMutableDictionary.dictionary;
id result = allTheSingletons[className];
//PO(result);
if (result==nil)
result = [[[self class] alloc]init];
allTheSingletons[className]=result;
[result additionalInitialization];
return result;
-(void) additionalInitialization
每当我想让一个类“继承”这个 BGSuperSingleton 时,我都会这样做:
#import "NSObject+singleton.h"
并添加@interface MyNewClass () <BGSuperSingleton>
【讨论】:
类别不是多重继承。它们是一种将方法/函数附加到已经存在的类的方法。多重继承允许第三个类是一个或多个类(包括变量)的组合。我喜欢分类。类别非常有用。但它们不是多重继承。 但是 UIViewController 的子类也可以“支持”,在这种情况下,我希望单例模式。 技术上所有 NSManagedObject “现在都可以调用” [obj singleton]。我在协议的支持下设置了我希望的那些。无论如何都与多重继承一样好。这只是当我想让子类同时支持父类的接口和实现时。如果只有实现,那么显然组合是要走的路。 只添加像你知道协议吗,协议是实现多重继承的方式
【讨论】:
+1 "捕捉没有层次关系的类之间的相似性。" developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 在这种情况下,两种方法都将被覆盖,协议可以解决问题。在其他情况下,当您想使用继承来重用代码时,协议将无济于事。然而,这通常可以通过让类超类相互继承,或者通过组合它们来解决,如果子类实际上与 2 个类共享代码,通常有一种方法可以解决问题。 您可以将协议与类别或组合结合起来。 -1 因为协议根本不存在多重继承。同样在JAVA
中,Interfaces
不提供或模仿多重继承。
@FreeAsInBeer 来自苹果自己的documentation 协议声明了一个任何类都可以选择实现的编程接口。协议使得通过继承关系远的两个类可以相互通信以实现特定目标。因此,它们提供了子类化的替代方法。如您所见,Apple 正在 显式使用子类化,即继承。也许 Nikesh 在他自己的回答中包括这一点将有助于澄清他的论点【参考方案3】:
Objective-C 不支持多重继承,你也不需要它。使用组合:
@interface ClassA : NSObject
-(void)methodA;
@end
@interface ClassB : NSObject
-(void)methodB;
@end
@interface MyClass : NSObject
ClassA *a;
ClassB *b;
-(id)initWithA:(ClassA *)anA b:(ClassB *)aB;
-(void)methodA;
-(void)methodB;
@end
现在您只需要调用相关 ivar 上的方法。它的代码更多,但在 Objective-C 中没有多重继承作为语言特性。
【讨论】:
组合通常是比继承更好的方法,尤其是当您对代码进行大量单元测试时。它提供了更大的灵活性,因为您可以轻松地更换实现,而无需重新定义类本身。当您想将 ClassA 和 ClassB 交换为模拟对象时特别方便。即使在运行时换出实现(例如 FTPFileStore 与 LocalFileStore),组合也会变得更干净。这并不意味着继承没有它的位置,但是多重继承的需要会建议我重新考虑我的设计;) 我不明白这个。不需要实例化ClassA
和ClassB
吗?在MyClass
上调用methodA:
是否会自动在ClassA
上调用methodA:
?
不,但是您仍然可以通过消息传递来共享行为,这是 OOP 最初应该工作的方式。如果您没有立即考虑需要继承,而是考虑使用组合的解决方案,您会发现您开始以更可维护的方式构建程序。当然,ObjC 对于正确使用它的情况有基本的继承。
看到这个@dllwtq tutorialspoint.com/objective_c/objective_c_inheritance.htm
d11wtq,很好的答案!另外,消息转发允许您跳过重新实现methodA和methodB的步骤。只需一点工作,消息就可以自动转发到适当的对象。 developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…以上是关于Objective-C 多重继承的主要内容,如果未能解决你的问题,请参考以下文章