我知道C#不支持类中的多重继承。
但是,我需要在MyClass中添加 ClassA和ClassB的功能:
public class ClassA
{
/* Third party class*/
}
public class ClassB
{
/* Third party class*/
}
public class MyClass : ClassA, ClassB
{
/*Compilation error*/
}
有什么方法可以实现这个目标吗?
答案 0 :(得分:9)
在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);
}
}
如果您需要能够在需要ClassA
的地方使用此课程,那么您可以添加转化运算符,将其转换回ClassA
或ClassB
。是否更适合返回这些新实例或暴露内部实例是您需要仔细考虑的。
显然,如果ClassA
或ClassB
实现任何接口,我建议您也在新课程中实现这些接口。
但是,在一天结束时,C#没有多个实现继承。如果您需要(这是罕见的),那么C#就不是一种合适的语言。也不是任何其他CLR语言,因为这是CLR限制,而不是特别是C#语言。
答案 1 :(得分:7)
如果您无法更改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();
}
}
答案 2 :(得分:1)
不,你不能从多个类继承。只允许多个接口继承。考虑使用组合代替:
public class MyClass : ClassA, IClassB
{
private IClassB _classB; // delegate IClassB implementation to it
public MyClass(IClassB classB)
{
_classB = classB;
}
public void BMethod()
{
_classB.BMethod();
}
}
答案 3 :(得分:1)
为ClassA和ClassB创建一个接口(分别称为IClassA和IClassB),其中包含您想要访问的所有方法。
然后在ClassA和ClassB中实现该接口。
最后,让MyClass实现IClassA和IClassB:
public class MyClass : IClassA, IClassB
{
}
答案 4 :(得分:0)
您可以为ClassA
和ClassB
生成接口,然后从MyClass