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 () &lt;BGSuperSingleton&gt;

【讨论】:

类别不是多重继承。它们是一种将方法/函数附加到已经存在的类的方法。多重继承允许第三个类是一个或多个类(包括变量)的组合。我喜欢分类。类别非常有用。但它们不是多重继承。 但是 UIViewController 的子类也可以“支持”,在这种情况下,我希望单例模式。 技术上所有 NSManagedObject “现在都可以调用” [obj singleton]。我在协议的支持下设置了我希望的那些。无论如何都与多重继承一样好。这只是当我想让子类同时支持父类的接口和实现时。如果只有实现,那么显然组合是要走的路。 只添加像 这样的协议不会使类能够调用“singleton”方法。你还是要实现它...【参考方案2】:

你知道协议吗,协议是实现多重继承的方式

【讨论】:

+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),组合也会变得更干净。这并不意味着继承没有它的位置,但是多重继承的需要会建议我重新考虑我的设计;) 我不明白这个。不需要实例化ClassAClassB 吗?在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 多重继承的主要内容,如果未能解决你的问题,请参考以下文章

多重继承,虚基类

java中的多重继承是啥意思?

什么是多重继承,单重继承?

多继承 与 多重继承

iOS常见面试题汇总带详细答案

理解虚基类多重继承的问题