1

我在 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没有接口类,我必须MasterCameraWindows.System.Forms.Form

我不想那样,那我怎么能绕过呢?

4

4 回答 4

2

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

公共接口 MasterCamera { ... }

它必须工作。

于 2012-09-12T09:10:40.680 回答
2

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

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

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

于 2012-09-12T09:12:10.757 回答
1

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

于 2012-09-12T09:08:24.060 回答
1

你正在努力Inheritance。也试试看Composition

不能Camera包含在Form?

于 2012-09-12T09:10:54.250 回答