0

我正在开发一个磁贴编辑器。在编辑器中,您可以加载瓦片地图。每个瓦片地图可以有多个图层。瓦片地图有一个图层列表。我现在需要图层类中的瓦片地图属性(例如瓦片宽度/高度之类的东西)。我现在问自己最好的方法是什么。

  1. 我可以通过在图层类中引入 tilemap 属性来建立双向关系,这样我就可以从那里访问我需要的一切。但后来我必须照顾关系的两个方面。

  2. 我可以使用构造函数将所有需要的属性赋予图层类,但随后它们基本上成为图层属性(也就是每个图层的不同对象)。

  3. 与 2 相同,但使用“ref”参数将属性赋予图层。

  4. 我可以创建一个名为 TileMapLayerProperties 的类,我将所有属性放入其中,然后将对象传递给图层类。优点是所有属性都是相同的,并且每个实例只有 tileMapLayerProperties-reference。另一个优点是层构造函数的“定义”变得更短。

因此,任何建议/提示将不胜感激。

4

3 回答 3

1

双向关联 (1) 可能合适或不合适,具体取决于瓦片地图包含的属性和方法以及图层应该能够知道和访问的内容。如果一个瓦片地图有一个DeleteAllLayers方法并且图层不能调用它,那么图层就不能直接访问它们的父级。

创建一个专用的属性对象 (4) 对我来说似乎更干净。这样,您就拥有了一个对象,其中包含您可以传递的所有必要信息,但它不包含更多信息,尤其是它不允许调用破坏性方法等。

将属性传递给构造函数 (2) 与 (4) 类似,但更冗长且面向对象更少。当你有 1 或 2 个属性时这很好,但如果有更多属性,它会变得丑陋且无法维护。

但是还有另一个问题:如果属性是不可变类型(例如 int、string),那么图层不会看到地图中所做的更改。他们只看到他们的私人副本!

我不明白(3)。ref关键字如何变化(2)?它只允许被调用者更改调用者传递的变量的值。还是您的意思是具有引用类型的对象?

另一种解决方案

接口将是解决此问题的另一种方法。您可以创建一个ITileMapLayerProperties提供所有属性的接口并将其传递给层的构造函数。映射可以实现接口本身,也可以包含TileMapLayerProperties实现接口的对象。但是该层不需要知道这一点。

于 2013-07-05T16:11:08.560 回答
0

选项 2 适用于您正在尝试做的事情,您可能不需要包含“ref”关键字。我很好奇,你想从子类访问什么样的数据成员?如果它们是集合,那么您可能不需要 'ref' 关键字。另一种选择是使父类静态,但我不确定这是否是您正在寻找的结果。您可以一次加载多个瓦片地图吗?如果没有,请考虑使用静态类选项。

于 2013-07-05T15:26:38.320 回答
0

我认为选项是 3 更好。您可以将您的引用传递ParentClassChildClass并且可以直接访问所有公共属性。我建议它更好,因为无论您从ChildClass或做出什么改变ParentClass,所有其他layers人都会继承这些改变。

于 2013-07-05T15:42:53.193 回答