可能重复:
C# 中的多重继承
我有两个类 A 类和 B 类。这两个类不能相互继承。我正在创建名为 C 类的新类。现在,我想通过继承来实现 A 类和 B 类中的方法。我知道在 C# 中不可能进行多重继承,但还有其他方法可以做到这一点吗?
多重继承在 C# 中是不可能的,但是可以使用接口来模拟它,请参阅C# 的模拟多重继承模式。
基本思想是为B
您希望访问的类上的成员定义一个接口(称为它IB
),然后通过内部存储一个实例来C
继承A
和实现,例如:IB
B
class C : A, IB
{
private B _b = new B();
// IB members
public void SomeMethod()
{
_b.SomeMethod();
}
}
该页面上还解释了其他几种替代模式。
继承的一个常见替代方法是委托(也称为组合):X“具有”Y 而不是 X“是”Y。因此,如果 A 具有处理 Foos 的功能,而 B 具有处理 Bars 的功能,并且您想要两者都在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
}
如果你想从字面上使用方法代码A
,B
你可以让你的C
类包含每个的实例。如果您针对接口进行编码A
,B
那么您的客户就不需要知道您给他们的是 aC
而不是 anA
或 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(); }
}
使用成分:
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
。
制作两个接口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)
,您将需要决定如何实现它,或者您是否只调用foo(bar)
两者_a
和_b
。正如其他地方所建议的那样,您应该考虑 a.A
和.B
属性,而不是结合这两个类。
您可以为这些基类定义一个基类,A
并且B
可以在其中保存它们的通用方法/属性/字段。
实施后C:Base
。
或者为了模拟多重继承,定义一个公共interface
(s)并在C
希望这可以帮助。
在这种情况下,您的意思是希望 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();
}
}