Biri methodA'yı, diğeri de methodB'yi içeren 2 sınıfım var. Yani yeni bir sınıfta methodA ve methodB yöntemlerini geçersiz kılmam gerekiyor. Öyleyse C hedefinde çoklu mirasa nasıl ulaşırım? Sözdizimi ile biraz kafam karıştı.
Yanıtlar:
Objective-C çoklu kalıtımı desteklemez ve buna ihtiyacınız yoktur. Kompozisyonu kullanın:
@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
Şimdi sadece ilgili ivar'daki yöntemi çağırmanız yeterlidir. Daha fazla kod, ancak amaç-C'de dil özelliği olarak çoklu kalıtım yoktur.
ClassA
ve ClassB
? Çağıran mu methodA:
üzerinde MyClass
nedense otomatik çağrı methodA:
üzerine ClassA
?
SingletonPattern'i bu şekilde "ebeveyn" olarak kodluyorum. Temelde protokol ve kategori kombinasyonunu kullandım.
Ekleyemediğim tek şey yeni bir "ivar" ancak onu ilişkili nesneyle itebilirim.
#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
{
}
Bir sınıfın bu BGSuperSingleton'ı "miras almasını" istediğimde, sadece şunu yapıyorum:
#import "NSObject+singleton.h"
ve Ekle @interface MyNewClass () <BGSuperSingleton>
Protokoller hakkında bilginiz var mı, protokoller çoklu kalıtımı gerçekleştirmenin yoludur
JAVA
, Interfaces
çoklu kalıtım sağlamak veya taklit etmek için değildir.