2つのクラスがあり、1つはmethodAを含み、もう1つはmethodBを含みます。新しいクラスでは、メソッドmethodAとmethodBをオーバーライドする必要があります。では、どうすれば目的Cで多重継承を実現できますか?構文に少し混乱しています。
回答:
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
?呼び出しんmethodA:
でMyClass
呼んで自動的に何とかmethodA:
上のClassA
?
これは、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>
プロトコルについて知っていますか、プロトコルは多重継承を実装する方法です
JAVA
、Interfaces
は多重継承を提供または模倣するものではありません。