2011-05-10 125 views
1

可能重複:
Objective C multiple inheritance多重繼承

嗨,

目標C不支持多重繼承。我將cpp代碼移植到Objective C中如何在Objective C中聲明此定義?

class A:protected B,protected C 
{ 
    //stmts; 
} 

@interface A:protected B,protected C 
{ 
} 
@end 

是不可能的。

回答

2

Objective-C不支持多繼承,所以這是不可能的。

繼承是一種「是一個」關係,一個類只能有一個是,一個通過繼承關係。通過協議(Java或C#parlace中的接口,或者C++中的完全抽象類),可以有幾個關係是-關係。

而不是is-a關係,您可以建模「has-a」關係。任何對象都可以有任何數量的關係。在實踐中,你只需要有一個你想要的每個類的實例變量。例如:

@interface A : NSObject { 
    @private 
    B* _b; 
    C* _c; 
} 
// ... stuff 
@end 

你需要從BC重新實現所有的方法,並根據需要調用到所包含的實例變量。例如,如果B實現theAnswer則還必須實現它在A爲:

-(int)theAnswer { 
    return [_b theAnswer]; 
} 

這很麻煩,但是這是你需要做的,當真正的多重繼承不可用。

+0

感謝您讓我明白 – spandana 2011-05-10 14:36:36

3

編號

不僅如此,所有超類與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的答案直接實施它們來優化大量使用的選擇器。

+0

這是一個請求。可以請您解釋一個示例代碼。我可以閱讀鏈接。但是請您可以用示例代碼來解釋我。 – spandana 2011-05-10 14:47:06

+0

@ron:請參閱編輯 – JeremyP 2011-05-10 15:00:21

+0

@ JeremyP.Thanks詳細解釋像我這樣的初學者。 – spandana 2011-05-11 07:10:12