嗨,
目標C不支持多重繼承。我將cpp代碼移植到Objective C中如何在Objective C中聲明此定義?
class A:protected B,protected C
{
//stmts;
}
@interface A:protected B,protected C
{
}
@end
是不可能的。
嗨,
目標C不支持多重繼承。我將cpp代碼移植到Objective C中如何在Objective C中聲明此定義?
class A:protected B,protected C
{
//stmts;
}
@interface A:protected B,protected C
{
}
@end
是不可能的。
Objective-C不支持多繼承,所以這是不可能的。
繼承是一種「是一個」關係,一個類只能有一個是,一個通過繼承關係。通過協議(Java或C#parlace中的接口,或者C++中的完全抽象類),可以有幾個關係是-關係。
而不是is-a關係,您可以建模「has-a」關係。任何對象都可以有任何數量的關係。在實踐中,你只需要有一個你想要的每個類的實例變量。例如:
@interface A : NSObject {
@private
B* _b;
C* _c;
}
// ... stuff
@end
你需要從B
和C
重新實現所有的方法,並根據需要調用到所包含的實例變量。例如,如果B
實現theAnswer
則還必須實現它在A
爲:
-(int)theAnswer {
return [_b theAnswer];
}
這很麻煩,但是這是你需要做的,當真正的多重繼承不可用。
編號
不僅如此,所有超類與C++中的公共類相當。
在Objective-C中,我們不像在C++相同的語言中那樣使用繼承,我們傾向於更多地使用組合。例如,如果您有一個類似數組的集合,您通常不會繼承NSArray
的子類,那麼您將創建一個可能使用NSArray
作爲其「後備存儲」的新類。
你可以做的一些技巧來轉發你的新類不響應其NSArray實例變量的消息。例如,您可以覆蓋 - forwardingTargetForSelector:,以便您的對象不響應的任何消息被轉發到基礎NSArray。如果你仔細想想,你可以用這個來實現一個自制的多重繼承。
編輯
一個例子:
如果你有一個類,提供了陣列狀的集合功能,你想所有的NSArray的方法,你可以這樣做:
@interface MyClass : NSObject
{
@private
NSArray* backingArray;
}
// declarations of your methods
@end
@implementation MyClass
// implementations for your methods + initialisation
-(id) forwardingTargetForSelector: (SEL) aSelector
{
return backingArray;
}
@end
實際上,對於簡單的情況,你永遠不會看到這樣的代碼 - 人們總是使用categories。如果你想用這個技巧來模擬多重繼承,你需要爲每個「繼承」類使用一個實例變量,並且方法-forwardingTargetForSelector:
需要基於選擇器的一些邏輯來決定返回哪個對象。這將會非常緩慢,因此您可以通過按照PeyloW的答案直接實施它們來優化大量使用的選擇器。
感謝您讓我明白 – spandana 2011-05-10 14:36:36