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(); }}

每次我向其中一个接口添加一个方法时,我都需要更改这个类。第一和第二也是。

有没有一种方法可以像在C+中那样将多个现有的类注入到一个新的类中?

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

或者看起来像这样(虚构的c#语法):

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

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


编辑

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

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

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

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

  2. 编写一个从TextTcpClient继承并以某种方式实现IComponent的新类(实际上还没有尝试过这一点)。

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

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


POPMUISE
浏览 806回答 3
3回答

慕沐林林

由于多重继承不好(使源变得更复杂),C#没有直接提供这样的模式。但有时候有这种能力会很有帮助。C#和.NET CLR没有实现MI,因为它们还没有确定C#、VB.net和其他语言之间的互操作方式,而不是因为“它会使源代码变得更加复杂”。MI是一个有用的概念,未回答的问题是这样的:“当您在不同的超类中有多个公共基类时,您会做什么?”Perl是我使用过的唯一种MI工作良好的语言。NET很可能有一天会引入它,但目前还没有,CLR已经支持MI了,但正如我所说的,除了这一点之外,还没有其他语言结构。在此之前,您只能使用代理对象和多个接口:(

宝慕林4294392

考虑使用构图而不是试图模拟多重继承。您可以使用接口来定义构成组合的类,例如:ISteerable意味着类型的性质SteeringWheel, IBrakable意味着类型的性质BrakePedal等一旦你这样做了,你可以用可拓方法在C#3.0中添加了特性,以进一步简化对这些隐含属性的调用方法,例如:public interface ISteerable { SteeringWheel wheel { get; set; } }public interface IBrakable { BrakePedal brake { get; set; } } public class Vehicle : ISteerable, IBrakable{     public SteeringWheel wheel { get; set; }     public BrakePedal brake { get; set; }     public Vehicle() { wheel = new SteeringWheel(); brake = new BrakePedal(); }}public static class SteeringExtensions{     public static void SteerLeft(this ISteerable vehicle)     {         vehicle.wheel.SteerLeft();     }}public static class BrakeExtensions{     public static void Stop(this IBrakable vehicle)     {         vehicle.brake.ApplyUntilStop();     }}public class Main{     Vehicle myCar = new Vehicle();     public void main()     {         myCar.SteerLeft();         myCar.Stop();     }}

HUH函数

我也喜欢这样-这就是我个人所说的“混搭”,尽管我意识到这是一个过份的术语。我希望能够指定用于实现接口的变量,并选择为特定方法提供自己的实现。我更详细地写了这篇博客-尽管在故意夸大继承方面可能意味着什么的情况下。我看不出为什么这不能在C#编译器中实现-但这是另一种语言复杂性.
打开App,查看更多内容
随时随地看视频慕课网APP