如何用C#建模未知数量的变量

时间:2011-06-07 09:43:18

标签: c# polymorphism

我不知道如何正确解释,有人请根据需要编辑我的标题和帖子。我认为这可以通过多态来解决,但我无法让它工作。我想要的是如下。

我将有不同的形状,它们都有不同的变量。例如,描述我需要的特定形状A:

每个形状的必填字段:

  • 起点和终点(组成 3个双变量:x,y和z)

  • name(string)

形状可能需要或不需要以下字段(将来我可能需要更多)

  • 长度,宽度,高度(均为双倍)
  • 角度
  • 其他变量可以是double或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列表,我无法访问新属性。我是对的吗?

很抱歉,如果不清楚,我会编辑添加所需的任何信息。非常感谢提前。

2 个答案:

答案 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对象,则需要描述各个构面和顶点。

我可能会大规模关闭,但又一次:我不了解所有要求。