【问题标题】:Need multiple inheritance functionality in C#. What am I doing wrong?需要 C# 中的多重继承功能。我究竟做错了什么?
【发布时间】:2011-06-21 18:36:28
【问题描述】:
class UDPClient
{
}

class LargeSimulator
{
}

class RemoteLargeSimulatorClient : UDPClient, LargeSimulator
{
}

俗话说,如果你需要多重继承,你的设计就不行了。

我如何在 C# 中完成这项工作而无需实现任何东西?

【问题讨论】:

  • 看起来您的设计已关闭。
  • 编辑:我想要实现继承而不是接口继承......是的,我知道接口......我只是想知道 c# 是否只是一堆复制/粘贴......或者有没有办法重用来自 1 个源的代码?
  • 你确定RemoteLargeSimulatorClient UDPClient吗?也许你应该改用组合。

标签: c# multiple-inheritance oop


【解决方案1】:

您只能从 C# 中的单个基类中继承。但是,您可以实现任意数量的接口。将此事实与Extension Methods 的出现结合起来,您就有了一个(hacky)解决方法。

【讨论】:

    【解决方案2】:

    C# 仅允许单继承,但您可以从任意多个接口继承。

    您可以只选择一个类来继承,然后制作其余的接口,或者只将它们全部设为接口。

    你也可以像这样链接你的继承:

    class UDPClient
    {
    }
    
    class LargeSimulator : UDPClient
    {
    }
    
    class RemoteLargeSimulatorClient : LargeSimulator
    {
    }
    

    【讨论】:

      【解决方案3】:

      要以您想要的方式获得多重继承,您需要将 UDPClient 和 LargeSimulator 设为 interface 而不是 class

      类多重继承在 C# 中是不可能的

      【讨论】:

        【解决方案4】:

        多重继承的一个可能替代品是 mixins。不幸的是,C# 也没有这些,但解决方法是可能的。大多数依赖于扩展方法的使用(正如之前的回答者所建议的那样)。请参阅以下链接:

        http://mortslikeus.blogspot.com/2008/01/emulating-mixins-with-c.html http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/ http://colinmackay.co.uk/blog/2008/02/24/mixins-in-c-30/

        【讨论】:

          【解决方案5】:

          简短的回答:C# 中不允许多重继承。阅读接口:http://msdn.microsoft.com/en-us/library/ms173156.aspx

          略长一点的答案:也许其他一些设计模式会适合你,比如策略模式等。继承并不是实现代码重用的唯一方法。

          【讨论】:

            【解决方案6】:
            interface ILARGESimulator
            {
            }
            
            interface IUDPClient
            {
            }
            
            class UDPClient : IUDPClient
            {
            }
            
            class LargeSimulator : ILARGESimulator
            {
            }
            
            class RemoteLargeSimulatorClient : IUDPClient, ILargeSimulator
            {
                private IUDPClient client = new UDPClient();
                private ILARGESimulator simulator = new LARGESimulator();
            
            }
            

            不幸的是,您需要为成员编写包装器方法。 C# 中不存在多重继承。但是,您可以实现多个接口。

            【讨论】:

            • LargeSimulator 有 100,000 个事件和方法(来自外部库)... UDPClient 具有低级网络内容.. 我需要选择 1 并复制粘贴吗?似乎很荒谬..对于一种真正的语言
            • 只是不要使用这个。您似乎不需要将两者合二为一的对象。加入这么大的东西似乎有点矫枉过正。也许游戏中缺少某些设计模式。
            • @jaybny,如果你能告诉我们更多关于你想要做什么的信息,我们本可以为你提供更好的帮助。听起来像 SOLID 和组合比接口、继承和抱怨 C# 只是“复制粘贴”对你有好处。 :)
            猜你喜欢
            • 2013-08-06
            • 1970-01-01
            • 1970-01-01
            • 2016-07-18
            • 1970-01-01
            • 1970-01-01
            • 2015-12-02
            • 2014-04-18
            • 2019-12-23
            相关资源
            最近更新 更多