我正在设计一个软件,用于显示基于 DataModel 的 ModelView 对象。
DataModel 由一个 ModelView 对象显示,该对象本身可以包含一堆 ViewObject。它就像一个ViewObjects的容器,构成一个ModelView,最后显示DataModel。
这些 ViewObject 在 ModelView 中可以相互依赖,例如一个 ViewObject 的位置可能依赖于另一个。
然后最终屏幕的布局也是基于所有 ModelView 决定的。
这些 ViewObject 继承自一个通用的 BaseView 类,但客户端可以通过继承自 BaseView 类简单地将新的 ViewObject 类型添加到层次结构中。这些派生类可能具有特定的功能,可能需要调用这些功能才能在 ModelView 中将它们连接在一起。
有人能告诉我如何在没有动态转换的情况下做到这一点吗?
编辑:我定义了以下类:
class EventView // ModelView class containing
{
private:
//Pointer to BaseViews constituting to ModelView
std::shared_ptr<BaseView> m_FlowView;
std::shared_ptr<BaseView> m_SourceView;
std::shared_ptr<BaseView> m_TargetView;
std::shared_ptr<BaseView> m_WorkerView;
std::shared_ptr<TEvent> m_Model;
}
客户端可以继承自BaseView,一个BaseView可以是一条线或者一个圆或者一条曲线或者其他任何东西。因此它们可以完全不同。在我看来,我只需要一个 BaseView 对象列表来绘制它们,但客户端代码有责任将它们互连在一起并将它们放在一起。但是因为我将只存储 BaseView 指针,所以客户端可能需要向下转型来互连元素。
最佳答案
根据我从您的问题中了解到的情况,您正在存储对象的基指针,但从外部来看,您希望将它们作为派生对象进行操作。
在这种情况下向下转型是必不可少的。
虽然您的问题含糊不清,但我认为您的情况与对话框中的控件非常相似,两者都是窗口,但说 CheckBox 是您想要专门操作的具有扩展功能的专用窗口。
Major framework use casting for this problem like MFC here .
较新的 Qt 框架也使用转换,如 findChildren功能。
我希望你能根据这些信息评估你的解决方案,并可能与它和解。
关于c++ - 如何设计避免类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238859/