2012-10-02 126 views
7

有可能實現此功能嗎? 我有兩個抽象類,我想強迫 第三類來實現兩個班.net抽象類的多重繼承

public abstract class A 
{ 
    private void MethodA() 
    { 
     var fool = Prop*2; 
    } 
    public abstract int Prop { get; } 
} 
public abstract class B 
{ 
    private void MethodB() 
    { 
     //.... 
     SomeMethod(); 
     //.... 
    } 
    public abstract void SomeMethod(); 
} 

public class C: A, B 
{ 
    public int Prop { .... } 
    public void SomeMethod { .... } 
} 

這裏的主要問題所有的抽象方法是,實現最後一類方法的基礎,然後使用抽象類,這不能通過接口來實現。所以沒有解決方法?

我讀過很多類似的q/a,但沒有迴應我的問題。 謝謝

+0

正如Claudio所說,不允許多重繼承。這裏有一些關於這個主題的好消息:http://blogs.msdn.com/b/dachou/archive/2008/04/17/net-and-multiple-inheritance.aspx – Gromer

回答

10

不,C#不支持多繼承。你可以實現多個接口,但這顯然不一樣,因爲接口不能實現任何具體行爲。

+0

這裏的主要問題是執行的最終類然後方法被用在基本的抽象類中,這不能通過接口來實現。所以沒有解決方法? –

+3

@Michele Virgilio:恐怕最簡單的答案是沒有解決方法,除了你的類的新設計。 –

1

具體是什麼?不,因爲C#中不支持多重繼承。

你可以得到將被使用結合其他兩個接口最接近:

public interface ISomeInterfaceA 
{ 
    int Prop { get; } 
} 

public interface ISomeInterfaceB 
{ 
    void SomeMethod(); 
} 

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB 
{ 

} 

那麼你可能需要ICombined類型的參數,但是這並不能完全讓你以後。舉例來說,如果我這樣做:

public class A : ISomeInterfaceA, ISomeInterfaceB 
{ 
    ... 
} 

這將不符合條件,因爲我沒有明確的實現組合接口,只是它是由兩個接口。

0

如果你願意以實現最終的類的功能,你可以創建接口和實現,只要你想盡可能多的...

2

您可以通過混入C#做到這一點,它的實現方式不同於多重繼承但最終你會得到一個包含來自幾個類的所有方法的對象。

這不是該語言的一個特性,但它可以在第三方中找到。

您可以在my answer to this other question讀到它,或直接在re-mix's codeplex

感興趣的幾點:
- 你可以覆蓋一個mixin方法,從而在外部修改新創建類的行爲。
- 您可以在範圍內創建的類中創建不同的作用域。
- 您需要通過工廠創建混合對象(新的MyObject()不會將Mixins考慮進去,謝天謝地)。