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窗体开发人员轻松访问。

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

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

  • 写一个继承自TextTcpClient的新类,并以某种方式实现IComponent(实际上还没有尝试过)。

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

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


    由于多重继承是不好的(它使得源代码更加复杂),C#不直接提供这样的模式。 但有时候这会有所帮助。

    C#和.net CLR还没有实现MI,因为他们还没有断定它将如何在C#,VB.net和其他语言之间进行互操作,这不是因为“它会使源更复杂”

    MI是一个有用的概念,未回答的问题是这样的:“当你在不同的超类中有多个共同基类时,你会做什么?

    Perl是我与MI合作过的唯一一种工作良好的语言。 .Net可能有一天会介绍它,但还没有,CLR已经支持MI,但正如我所说,除此之外,还没有任何语言结构。

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


    考虑只使用组合而不是试图模拟多重继承。 您可以使用接口来定义构成组成的类,例如:可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();
        }
    }
    

    我也想这样 - 这就是我个人所说的混搭,尽管我意识到这是一个超负荷的术语。 我希望能够指定用于实现接口的变量,并可以选择为特定方法提供我自己的实现。

    我已经更详细地对此进行了博客 - 尽管在继承方面故意高估了它可能意味着什么。

    我没有看到为什么不能在C#编译器中实现这个原因 - 但这是另一种语言复杂性。

    链接地址: http://www.djcxy.com/p/39429.html

    上一篇: Multiple Inheritance in C#

    下一篇: Generic type conversion FROM string