我有兩個類的類和B類這兩個類不能繼承彼此。我正在創建一個名爲Class C的新類。現在,我想通過繼承來實現類A和類B中的方法。我知道多重繼承在C#中是不可能的,但有沒有其他方法可以做到這一點?
感謝
我有兩個類的類和B類這兩個類不能繼承彼此。我正在創建一個名爲Class C的新類。現在,我想通過繼承來實現類A和類B中的方法。我知道多重繼承在C#中是不可能的,但有沒有其他方法可以做到這一點?
感謝
多重繼承在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模式。
繼承的另一種常見替代方法是授權(也稱爲組合):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
}
使用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 A
或public AbstractClassA A
。
如果你想從字面上使用A
和B
的方法代碼,你可以讓你的C
類包含每個的實例。如果您針對A
和B
的接口編碼,那麼您的客戶不需要知道您給他們的是C
而不是A
或B
。
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(); }
}
讓兩個接口IA
和IB
:
public interface IA
{
public void methodA(int value);
}
public interface IB
{
public void methodB(int value);
}
下使A
實施IA
和B
實施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); }
}
一般來說,這是一個糟糕的設計整體,因爲你可以同時擁有A
和B
實現具有相同的名稱和可變類型,如foo(int bar)
方法您需要決定如何實施它,或者您只需在_a
和_b
上撥打foo(bar)
即可。正如其他地方所建議的,您應該考慮.A
和.B
屬性,而不是將這兩個類相結合。
您的意思是您希望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();
}
}
你或許應該使用的界面... http://stackoverflow.com/questions/178333/multiple-inheritance-in-c-sharp – Oofpez
好Q薩蒂什:對 – Jacooobley