【问题标题】:Issue with inheritance in C#C#中的继承问题
【发布时间】:2012-09-12 09:04:48
【问题描述】:

我遇到了 C# 中不允许的多重继承的问题

以下场景:

class MasterCamera { ... }

class CameraFromManufacturerA : MasterCamera { ... }

class CameraFromManufacturerB : MasterCamera { ... }

class CameraFromManufacturerC : MasterCamera { ... }

MasterCamera 提供了一些功能,如StartCamera()ConnectCamera() 等。 在我的主要代码中,我使用了一个对象 MasterCamera mCamera = CameraSelector.GetCamera(); 使用 CameraSelector 检查是否连接了来自 A、B 或 C 的摄像头,并返回该对象(例如 CameraFromManufacturerA

理论上这工作得很好,但是其中一个摄像头的 API 需要使用 WindowsMessageCallback (WndProc),因此我只需要为该摄像头添加 Windows.System.Forms.Form

由于C#不允许多重继承,而afaik Form没有接口类,我必须让MasterCamera继承自Windows.System.Forms.Form

我不想这样,那我该如何解决呢?

【问题讨论】:

    标签: c# multiple-inheritance


    【解决方案1】:

    您不应将 MasterCamera { ... } 用作类,而应将其用作接口 喜欢:

    公共接口 MasterCamera { ... }

    它必须有效。

    【讨论】:

    • 谢谢,成功了。不知道你可以使用接口作为对象来调用函数。
    • 这没有提供实现通用功能的方法。
    • 确实如此,但由于每个相机的制造商API完全不同,因此几乎没有通用代码。
    【解决方案2】:

    这是继承的一个常见问题,这就是为什么 GoF 声明“优先组合优于继承”的原因

    您可以使用Strategy 模式。与其派生不同类型的MasterCamera,不如派生不同类型的ICameraFunctionality,并将该实例的对象存储在MasterCamera(或者更确切地说只是Camera)类中。

    这样 MasterCamera 只做普通的工作,但调用它的ICameraFunctionality 实例来执行特定的工作。

    【讨论】:

      【解决方案3】:

      如果您只是在代码中反转 依赖关系会怎样。 创建一个覆盖 WindowsMessageCallback 并能够托管 MasterCamera 对象的 Form 类,这将是您需要的子 Camera 类。

      【讨论】:

        【解决方案4】:

        您正在尝试Inheritance。也可以试试Composition

        Camera 不能包含在 Form 中吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-11
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多