可能重复:
C#中的多重继承
我有两个类A类和B类.这两个类不能相互继承.我正在创建一个名为Class C的新类.现在,我希望通过继承来实现A类和B类中的方法.我知道在C#中不可能有多重继承,但有没有其他方法可以做到这一点?
谢谢
KF2*_*KF2 38
C#中无法实现多重继承,但可以使用接口进行模拟,请参阅C#的模拟多重继承模式.
基本思想是为B您希望访问(调用它IB)的类定义一个接口,然后通过内部存储实例来C继承A和实现,例如:IBB
class C : A, IB
{
private B _b = new B();
// IB members
public void SomeMethod()
{
_b.SomeMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
该页面上还有一些其他的替代模式.
Ric*_*ich 10
继承的共同选择是代表团(也称为组成):X"有一个" Y而非X"是一个" Y因此如果有处理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
}
Run Code Online (Sandbox Code Playgroud)
使用成分:
class ClassC
{
public ClassA A { get; set; }
public ClassB B { get; set; }
public C (ClassA a, ClassB b)
{
this.A = a;
this.B = b;
}
}
Run Code Online (Sandbox Code Playgroud)
然后就可以调用了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(); }
}
Run Code Online (Sandbox Code Playgroud)
创建两个接口IA和IB:
public interface IA
{
public void methodA(int value);
}
public interface IB
{
public void methodB(int value);
}
Run Code Online (Sandbox Code Playgroud)
接下来制定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; }
}
Run Code Online (Sandbox Code Playgroud)
然后按如下方式实现您的 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); }
}
Run Code Online (Sandbox Code Playgroud)
一般来说,这总体上是一个糟糕的设计,因为您可以同时拥有A并B实现具有相同名称和变量类型的方法,例如foo(int bar)和 您将需要决定如何实现它,或者如果您只foo(bar)调用_a和_b。正如其他地方所建议的,您应该考虑 a.A和.B属性,而不是组合这两个类。
| 归档时间: |
|
| 查看次数: |
108584 次 |
| 最近记录: |