小编典典

C#中的多重继承

all

由于多重继承不好(它使源代码更复杂)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
的所有方法,那么将这两者组合到一个类中将是最简单的解决方案。

为避免冲突,这可以通过代码生成来完成,其中结果可以在之后更改,但是手动输入是纯粹的痛苦。


阅读 116

收藏
2022-06-01

共1个答案

小编典典

由于多重继承不好(它使源代码更复杂)C# 没有直接提供这样的模式。但有时拥有这种能力会有所帮助。

C# 和 .net CLR 还没有实现 MI,因为他们还没有得出结论它将如何在 C#、VB.net
和其他语言之间进行互操作,而不是因为“它会使源代码更复杂”

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

Perl 是我曾经使用过的唯一一种在 MI 工作并且运行良好的语言。.Net 可能有朝一日会推出它,但目前还没有,CLR 确实已经支持
MI,但正如我所说,除此之外还没有任何语言结构。

在那之前,你会被代理对象和多个接口卡住:(

2022-06-01