我不知道如何正确解释,有人请根据需要编辑我的标题和帖子。我认为这可以通过多态来解决,但我无法让它工作。我想要的是如下。
我将有不同的形状,它们都有不同的变量。例如,描述我需要的特定形状A:
每个形状的必填字段:
起点和终点(组成 3个双变量:x,y和z)
name(string)
形状可能需要或不需要以下字段(将来我可能需要更多)
问题是,这需要灵活,因为每个形状都将使用XML进行描述,然后我需要将其加载到程序中。例如,一个立方体就像这样:
<?xml version="1.0" encoding="utf-8" ?>
<structure name="Cube">
<variables>
<point name="start" />
<point name="end" />
<length name="width" min="1" max="10000" unit="mm" />
<length name="height" min="1" max="10000" unit="mm" />
</variables>
<points>
<point name="topLeft">
<x>start.x</x>
<y>start.y - height/2</y>
<z>start.z</z>
</point>
<point name="topRight">
<x>end.x</x>
<y>end.y - height/2</y>
<z>end.z</z>
</point>
<point name="bottomLeft">
<x>start.x</x>
<y>start.y + height/2</y>
<z>start.z</z>
</point>
<point name="bottomRight">
<x>end.x</x>
<y>end.y + height/2</y>
<z>end.z</z>
</point>
</points>
<connections>
<connection type="line">
<point name="topLeft" />
<point name="topRight" />
<point name="bottomRight" />
<point name="bottomLeft" />
<point name="topLeft" />
</connection>
</connections>
</structure>
所以我想的是,我有一个名为CVariable的基类(有两个抽象方法,parseString和toString),然后我继承它们来制作CLength(新属性double length),CPoint(新属性double x,y和z)和CName(新属性字符串名称)。然后我可以有一个名为CShape的类,它有一个CVariable,CPoint和CName列表(连接,只是一个标识要连接的点的名称)。问题是,我相信,如果我有一个CVariable列表,我无法访问新属性。我是对的吗?
很抱歉,如果不清楚,我会编辑添加所需的任何信息。非常感谢提前。
答案 0 :(得分:1)
您正在考虑的方案通常被称为“变体”。 CVariable
不是一个好名字,它只是非特定的。但是你已经在思考正确的方向了。通过从公共基类派生,您可以将元素打包在公共容器中。访问这些派生类型的技巧是使用运行时类型信息系统:typeof
关键字告诉您所引用的对象的实际类型:http://msdn.microsoft.com/de-de/library/58918ffs.aspx
警告:进入需要变体的情况通常是暗示,数据结构设计中的某些内容可能存在缺陷,重新思考问题是一个好主意。
答案 1 :(得分:0)
从我看到的情况来看,你已经过度工程了。为什么不呢:
<cube center-x="44" center-y="-43" center-z="20" edge-length="42" />
<sphere center-x="0" center-y="1" radius="3" />
然后,每个类将负责从XML表示中加载自身并将自身序列化回XML。
但是,如果您需要能够描述任意3D对象,则需要描述各个构面和顶点。
我可能会大规模关闭,但又一次:我不了解所有要求。