代码之家  ›  专栏  ›  技术社区  ›  Dilshan

目标C多重遗传

  •  87
  • Dilshan  · 技术社区  · 15 年前

    我有两个类,一个包含methoda,另一个包含methodb。所以在一个新类中,我需要重写方法methoda和methodb。那么,如何在目标C中实现多重继承呢?我对语法有点困惑。

    3 回复  |  直到 13 年前
        1
  •  133
  •   d11wtq Vadim Baryshev    15 年前

    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中没有作为语言特性的多重继承。

        2
  •  3
  •   StaRbUck42    13 年前

    这就是我将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>

        3
  •  -4
  •   Satya    14 年前

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