2012-06-21 67 views
7

可能重複:
Multiple Inheritance in C#從兩個類繼承在C#

我有兩個類的類和B類這兩個類不能繼承彼此。我正在創建一個名爲Class C的新類。現在,我想通過繼承來實現類A和類B中的方法。我知道多重繼承在C#中是不可能的,但有沒有其他方法可以做到這一點?

感謝

+0

你或許應該使用的界面... http://stackoverflow.com/questions/178333/multiple-inheritance-in-c-sharp – Oofpez

+0

好Q薩蒂什:對 – Jacooobley

回答

27

多重繼承在C#中是不可能的,但它可以使用接口進行模擬,請參見Simulated Multiple Inheritance Pattern for C#

的基本思想是定義您要訪問的B類成員一個接口(稱之爲IB),然後有C繼承A和內部存儲B的實例,例如實現IB

class C : A, IB 
{ 
    private B _b = new B(); 

    // IB members 
    public void SomeMethod() 
    { 
     _b.SomeMethod(); 
    } 
} 

在該頁面上還介紹了其他一些alternaitve模式。

3

您可以定義一個基類爲AB在那裏你可以持有共同方法/屬性/那些領域。

執行器C:Base

,或者爲了模擬多重繼承,定義一個通用interface(S)和C

希望這有助於實現它們。

+0

如果我使用接口,然後我需要在類C中定義方法。有沒有其他方法可以直接調用方法? – Virus

+0

@Virus:您不需要定義**所有**方法,但只需要定義不同類型之間*共享*的方法。 – Tigran

7

繼承的另一種常見替代方法是授權(也稱爲組合):X「具有」Y而不是X「是」Y. 因此,如果A具有處理Foos的功能,並且B具有處理酒吧,並在C想同時,則是這樣的:

public class A() { 
    private FooManager fooManager = new FooManager(); // (or inject, if you have IoC) 

    public void handleFoo(Foo foo) { 
    fooManager.handleFoo(foo); 
    } 
} 

public class B() { 
    private BarManager barManager = new BarManager(); // (or inject, if you have IoC) 

    public void handleBar(Bar bar) { 
    barManager.handleBar(bar); 
    } 
} 

public class C() { 
    private FooManager fooManager = new FooManager(); // (or inject, if you have IoC) 
    private BarManager barManager = new BarManager(); // (or inject, if you have IoC) 

    ... etc 
} 
2

使用composition

class ClassC 
{ 
    public ClassA A { get; set; } 
    public ClassB B { get; set; } 

    public C (ClassA a, ClassB b) 
    { 
     this.A = a; 
     this.B = b; 
    } 
} 

然後就可以調用C.A.DoA()。您還可以將屬性更改爲接口或抽象類,如public InterfaceA Apublic AbstractClassA A

6

如果你想從字面上使用AB的方法代碼,你可以讓你的C類包含每個的實例。如果您針對AB的接口編碼,那麼您的客戶不需要知道您給他們的是C而不是AB

interface IA { void SomeMethodOnA(); } 
interface IB { void SomeMethodOnB(); } 
class A : IA { void SomeMethodOnA() { /* do something */ } } 
class B : IB { void SomeMethodOnB() { /* do something */ } } 
class C : IA, IB 
{ 
    private IA a = new A(); 
    private IB b = new B(); 
    void SomeMethodOnA() { a.SomeMethodOnA(); } 
    void SomeMethodOnB() { b.SomeMethodOnB(); } 
} 
3

讓兩個接口IAIB

public interface IA 
{ 
    public void methodA(int value); 
} 

public interface IB 
{ 
    public void methodB(int value); 
} 

下使A實施IAB實施IB

public class A : IA 
{ 
    public int fooA { get; set; } 
    public void methodA(int value) { fooA = value; } 
} 

public class B : IB 
{ 
    public int fooB { get; set; } 
    public void methodB(int value) { fooB = value; } 
} 

然後實現你的C類,如下所示:

public class C : IA, IB 
{ 
    private A _a; 
    private B _b; 

    public C(A _a, B _b) 
    { 
     this._a = _a; 
     this._b = _b; 
    } 

    public void methodA(int value) { _a.methodA(value); } 
    public void methodB(int value) { _b.methodB(value); } 
} 

一般來說,這是一個糟糕的設計整體,因爲你可以同時擁有AB實現具有相同的名稱和可變類型,如foo(int bar)方法您需要決定如何實施它,或者您只需在_a_b上撥打foo(bar)即可。正如其他地方所建議的,您應該考慮.A.B屬性,而不是將這兩個類相結合。

4

您的意思是您希望C類在此情況下成爲A & B的基類。

public abstract class C 
{ 
    public abstract void Method1(); 

    public abstract void Method2(); 
} 

public class A : C 
{ 
    public override void Method1() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void Method2() 
    { 
     throw new NotImplementedException(); 
    } 
} 


public class B : C 
{ 
    public override void Method1() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void Method2() 
    { 
     throw new NotImplementedException(); 
    } 
}