2010-07-08 54 views
-1

我倾向于有一个类来描述一个概念和一个子类来描述该概念中的差异。例如,Polygon < | - {Rectangle,Triangle等}。根据其专用类型确定数据对象的表示类?

但是,我经常发现我有这些层次结构的各种表示。例如,我想将图形表示(例如QPolygon)或物理表示(mass,centerOfMass)等与其他表示相分离。

在我的情况,我有纯粹数据对象的分层结构(Command < | - {WaitCommandUnknownCommand等})和I具有匹配的GUI表示对于每个数据类(WaitCommandPanelUnknownCommandPanel)的。

我的问题是,一旦我构造数据表示,我需要从数据到GUI的闰秒

给定一个数据对象列表,我希望能够构造相应的GUI元素,但保持两个表示分离。

每个Command都有一个[糟糕的]解决方案有能力(即,Command::getPanel())返回它的GUI表示。我不喜欢这样做,因为我的数据类现在有表示代码。

另一种解决方案(我目前采用的方法)是查找。也就是说,当启动GUI时,给定一个Command s(泛化)的列表,该函数根据其专用类型确定要创建的对象。我也不喜欢这个。

有什么建议吗?

回答

0

恕我直言,没有数据类没有渲染类有责任决定哪个渲染器用于给定的数据对象。我更喜欢你的第二个选择。我通常使用将数据类型映射到渲染器类的映射。还要注意,这种映射是特定于上下文的(网络渲染将使用来自destop应用程序或健身环境的不同渲染器)。

这样的映射可以自动构造,例如使用属性(在.Net中)或者命名约定(在Lua中)。或者使用外部XML配置文件。

摘要:有人必须作出该决定,根据SRP,呈现器和数据对象都不应对此负责。这种逻辑是特定于应用程序上下文的,因此应该在这两个角色(即渲染器和数据)的“上方”。

+0

我Matryoshka-dolled我的GUI(主窗口有项目面板,项目面板有命令面板等)每个级别都不知道它在哪里嵌套/上面的级别。但是,每个级别都知道下面的级别(这是下级级别存在的上下文),我想我会将其保留到面板用于决定的级别。我不需要任何花哨的XML,因为类的配对不会改变(''X''总是使用'​​XPanel'作为GUI表示。)另外,这很容易在python中使用字典关联:type(X)=> XPanel的构造函数。谢谢。 – jkiv 2010-07-09 13:31:55

+0

特别是与Python,你可以使用命名约定来做关联。遍历范围并填充您的渲染器查找映射,以便将任何类型的窗体(?。*)Renderer注册为:type(obj)=> type(objRenderer)。所以你只需要定义类MyData和MyDataRenderer - 并且它们会自动关联。 (恕我直言,这种方法是**酷**,但不实际 - 会导致更多的问题比解决) – 2010-07-09 16:17:19

0

你可能想看看使用控制反转(IoC)容器来建立你的类。

每个类都将包含与其关联的类的接口。然后,IoC容器会根据您的配置如何将该类的实现注入到对象中。

+0

我会研究它,谢谢! – jkiv 2010-07-09 13:34:35