我有两个类A类和B类。这两个类不能相互继承。我正在创建一个名为Class C的新类。现在,我希望通过继承来实现A类和B类中的方法。我知道C#中不可能有多重继承,但有没有其他方法可以做到这一点?
由于
答案 0 :(得分:34)
在C#中无法实现多层继承,但可以使用接口进行模拟,请参阅Simulated Multiple Inheritance Pattern for C#。
基本思想是为您要访问的类B
上的成员定义一个接口(称之为IB
),然后让C
继承自A
并通过内部存储IB
的实例来实现B
,例如:
class C : A, IB
{
private B _b = new B();
// IB members
public void SomeMethod()
{
_b.SomeMethod();
}
}
该页面上还有其他几种替代模式。
答案 1 :(得分:9)
继承的常见替代方法是委托(也称为组合):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
}
答案 2 :(得分:7)
如果您希望逐字地使用A
和B
中的方法代码,则可以使C
类包含每个类的实例。如果您针对A
和B
的界面进行编码,那么您的客户无需知道您给他们C
而不是A
或{{1 }}
B
答案 3 :(得分:4)
使用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
。
答案 4 :(得分:3)
您可以为A
和B
定义基类,您可以在其中保存常用方法/属性/字段。
实施C:Base
之后。
或者为了模拟多重继承,定义一个公共interface
(s)并在C
希望这有帮助。
答案 5 :(得分:3)
制作两个接口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
和.B
属性,而不是将这两个类合并。
答案 6 :(得分:0)
你的意思是你希望C级成为A& 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();
}
}