web-dev-qa-db-ja.com

Objective-Cの多重継承

MethodAを含む2つのクラスとmethodBを含む2つのクラスがあります。そのため、新しいクラスでは、methodAメソッドとmethodBメソッドをオーバーライドする必要があります。それでは、目的Cで多重継承を実現するにはどうすればよいですか?私は構文と少し混同しています。

87
Dilshan

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の言語機能としての多重継承はありません。

133
d11wtq

これは、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
Septiadi Agus