【问题标题】:Objective-C multiple inheritanceObjective-C 多重继承
【发布时间】:2011-05-10 16:24:03
【问题描述】:

我有 2 个类,一个包括 methodA,另一个包括 methodB。所以在一个新类中我需要重写方法methodA和methodB。那么如何在Objective C中实现多重继承呢?我对语法有点困惑。

【问题讨论】:

    标签: objective-c inheritance multiple-inheritance


    【解决方案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 对于正确使用它的情况有基本的继承。
    • d11wtq,很好的答案!另外,消息转发允许您跳过重新实现methodA和methodB的步骤。只需一点工作,消息就可以自动转发到适当的对象。 developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
    猜你喜欢
    • 2014-04-30
    • 2011-05-28
    • 2011-08-22
    • 1970-01-01
    • 2014-03-08
    • 2018-01-31
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多