我正在寻求关于我当前的方法是否有意义的建议。如果没有,我想要一些关于某种类型的设计模式的建议,可以用来取代我当前的直觉。
我的前提是我有一台相机,需要带有 CameraLink 或 CoaXPress 电缆接口的图像采集卡才能连接到 PC。相机和计算机之间的所有通信和数据传输都必须使用图像采集卡进行控制,因此这两个物理硬件对象之间的耦合非常紧密。
我的问题是我想创建一个“Camera”对象(对于GUI),它有一个“FrameGrabber”卡对象,它用来获取数据并发送/接收命令和数据。然而,我有许多不同类型的图像采集卡。我们将它们称为 CoaxGrabberA、CoaxGrabberB、LinkGrabberA 和 LinkGrabberB。与 LinkGrabber 相比,CoaxGrabber 需要一组不同的初始化参数、setter 和 getter。
因此,我认为我需要使用两个级别的继承,但从我读到的所有内容来看,继承应该很少使用,并且应该倾向于组合。因此,我非常怀疑我的设计决策,并寻求某种更好的设计。这是一些半生不熟的代码的示例。虽然有点长,但重要的部分是 CoaxGrabberA、CoaxGrabberB、LinkGrabberA 和 LinkGrabberB 是 FrameGrabber 的孙子,Camera 必须可以访问它们。其他的一切都是为了补充你可能需要的细节。
我的目标是在运行时选择我想要用于相机对象的任何帧捕获器(任何品牌/型号/接口)。此外,我想轻松访问该孙子帧捕获器类型特有的所有成员函数,以在运行时修改硬件的行为。
我的问题是“是否有一种特定的设计模式可以匹配我不知道的问题,这会让我的生活比使用我天真的、直观的方法更轻松”
//-----------------------------------------
// Parent Class
//=========================================
class FrameGrabber {
public:
virtual void sendCommandString(std::string cmd) = 0;
virtual void startAcquisition() = 0;
virtual void stopAcquisition() = 0;
};
//-----------------------------------------
// Children Classes
//=========================================
class CoaxGrabber : FrameGrabber {
public:
//functions unique to coax grabbers
virtual void setCommAddress(int commAddress) = 0; …Run Code Online (Sandbox Code Playgroud)