Tôi có 2 lớp một bao gồm methodA và một bao gồm methodB. Vì vậy, trong một lớp mới, tôi cần ghi đè các phương thức methodA và methodB. Vậy làm cách nào để đạt được đa kế thừa trong mục tiêu C? Tôi hơi nhầm lẫn với cú pháp.
Câu trả lời:
Objective-C không hỗ trợ đa kế thừa và bạn không cần nó. Sử dụng thành phầ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
Bây giờ bạn chỉ cần gọi phương thức trên ivar có liên quan. Nó nhiều mã hơn, nhưng không có đa kế thừa như một tính năng ngôn ngữ trong mục tiêu-C.
ClassA
và ClassB
? Liệu gọi methodA:
vào MyClass
bằng cách nào đó tự động gọi methodA:
về ClassA
?
Đây là cách tôi viết mã singletonPattern với tư cách là "cha mẹ" Về cơ bản, tôi đã sử dụng kết hợp giao thức và danh mục.
Điều duy nhất tôi không thể thêm là một "ivar" mới, tuy nhiên, tôi có thể đẩy nó với đối tượng liên quan.
#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
{
}
Bất cứ khi nào tôi muốn một lớp "kế thừa" BGSuperSingleton này, tôi chỉ cần làm:
#import "NSObject+singleton.h"
và thêm @interface MyNewClass () <BGSuperSingleton>
Bạn có biết về Giao thức không, giao thức là cách để thực hiện đa kế thừa
JAVA
, Interfaces
không cung cấp hoặc bắt chước đa kế thừa.