一尘不染

C#中的多重继承

c#

由于多重继承很糟糕(这会使源代码更加复杂),因此C#不会直接提供这种模式。但是有时具有此功能会有所帮助。

例如,我可以使用接口和三个类似的类来实现缺少的多重继承模式:

public interface IFirst { void FirstMethod(); }
public interface ISecond { void SecondMethod(); }

public class First:IFirst 
{ 
    public void FirstMethod() { Console.WriteLine("First"); } 
}

public class Second:ISecond 
{ 
    public void SecondMethod() { Console.WriteLine("Second"); } 
}

public class FirstAndSecond: IFirst, ISecond
{
    First first = new First();
    Second second = new Second();
    public void FirstMethod() { first.FirstMethod(); }
    public void SecondMethod() { second.SecondMethod(); }
}

每次我向其中一个接口添加一个方法时,都需要更改 FirstAndSecond 类。

有没有办法像C ++中那样将多个现有类注入到一个新类中?

也许有使用某种代码生成的解决方案?

或者它可能看起来像这样(虚构的C#语法):

public class FirstAndSecond: IFirst from First, ISecond from Second
{ }

这样,当我修改一个接口时,就不需要更新类FirstAndSecond。


编辑

也许最好考虑一个实际的例子:

您有一个现有的类(例如,基于ITextTcpClient的基于文本的TCP客户端),您已经在项目中的不同位置使用了该类。现在,您感觉需要创建类的组件,以便Windows窗体开发人员可以轻松访问。

据我所知,您目前有两种方法可以做到这一点:

  1. 编写一个从组件继承的新类,并使用该类本身的实例实现TextTcpClient类的接口,如FirstAndSecond所示。

  2. 编写一个继承自TextTcpClient的新类,并以某种方式实现IComponent(实际上尚未尝试过)。

在这两种情况下,您都需要按方法而不是按类进行工作。既然您知道我们将需要TextTcpClient和Component的所有方法,那么将这两种方法组合为一个类将是最简单的解决方案。

为了避免冲突,这可以通过代码生成来完成,在代码生成后可以更改结果,但是手动键入此代码纯属麻烦。


阅读 556

收藏
2020-05-19

共1个答案

一尘不染

由于多重继承很糟糕(这会使源代码更加复杂),因此C#不会直接提供这种模式。但是有时具有此功能会有所帮助。

C#和.net CLR尚未实现MI,因为他们尚未得出结论,即如何在C#,VB.net和其他语言之间实现互操作,而不是因为“它将使源代码更加复杂”。

MI是一个有用的概念,未解决的问题是:-“如果在不同的超类中有多个公共基类,您会怎么做?

Perl是我曾经使用过的唯一语言,其中MI可以很好地工作。.Net可能有一天会引入它,但还没有,CLR已经支持MI,但是正如我所说的那样,目前还没有语言构造。

在此之前,您只能使用代理对象和多个接口:(

2020-05-19