D J*_*D J 1 .net c# inheritance
可能重复:
C#中的多重继承
我知道C#不支持类中的多重继承.
不过,我需要做补充的功能都 ClassA和ClassB的MyClass中:
public class ClassA
{
/* Third party class*/
}
public class ClassB
{
/* Third party class*/
}
public class MyClass : ClassA, ClassB
{
/*Compilation error*/
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以实现吗?
在C#中只能有多个接口继承.使用这些第三方类可以做的最好的事情是封装每个第三方类的实例MyClass并重新创建每个函数调用并将其传递给适当的实例.
public class MyClass
{
ClassA a = new ClassA();
ClassB b = new ClassB();
void AMethod()
{
a.AMethod();
}
int BMethod(int value)
{
return b.BMethod(value);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要能够在需要的位置使用此类ClassA,则可以添加转换运算符以将其转换回ClassA或ClassB.是否更适合返回这些新实例或暴露内部实例是您需要仔细考虑的.
显然,如果ClassA还是ClassB 做实现任何接口,我建议你实现这些在你的新类也.
但是,在一天结束时,C#没有多个实现继承.如果你需要这样的(这是罕见的),那么C#就不是一种合适的语言.也没有任何其他CLR语言,因为这是CLR限制,而不是特别是C#语言.
如果您无法更改ClassA,ClassB我建议为这些类创建子类型,然后进行聚合.
//third party
class ClassA
{
void X();
}
class ClassB
{
void Y();
}
//your code
interface IClassA
{
void X();
}
interface IClassB
{
void Y();
}
class MyClassA : ClassA, IClassA { }
class MyClassB : ClassB, IClassB { }
class MyClass : IClassA, IClassB
{
IClassA a = new MyClassA();
IClassB b = new MyClassB();
public void X()
{
a.X();
}
public void Y()
{
b.Y();
}
}
Run Code Online (Sandbox Code Playgroud)