c++ - 如何设计避免类型转换

标签 c++ oop design-patterns

我正在设计一个软件,用于显示基于 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/

相关文章:

perl - 如何检查每次调用对象方法时的某些值?

c# - 访问外部信息的 DDD 方法

c++ - 无法将某些函数从一个文件移动到另一个 C++

c++ - 在用户输入期间停在空白行 (C++)

python - 什么是面向对象编程的计算开销成本?

c# - 不可变与可变 C#

php - 如何避免到处传递上下文对象?

java - 根据条件创建不同的 POJO 子对象,但共享公共(public)字段

c++ - 使用 Crypto++ 加密 RSA 私钥并将其写入文件

c++ - extern auto 变量没有初始值设定项