2013-07-05 121 views
0

我正在处理一个图块编辑器。在编辑器中,您可以加载瓦片贴图。每个瓷砖地图可以有多个图层。瓷砖地图有它的图层列表。我现在需要图层类中的图块地图属性(比如瓦片宽度/高度等)。我现在问自己最好的办法是什么。从子类中访问父属性的最佳方法

  1. 我能在层类引入tilemap的属性的双向关系,使我有机会获得的一切,我从那里需要。但是,我将不得不照顾双方的关系。我可以用构造函数给图层类提供所有需要的属性,但它们基本上变成了图层属性(也就是说,它们是每个图层的不同对象)。

  2. 与2相同,但将属性赋予具有“ref”参数的图层。

  3. 我可以做一个叫做TileMapLayerProperties的类,在这里我把所有的属性都放进去然后把对象传递给图层类。好处是所有的属性都是一样的,只有tileMapLayerProperties引用是每个实例。另一个优点是层构造器的“定义”变得更短。

所以,任何建议/技巧将不胜感激。

回答

1

双向关联(1)可能正常或不正常,这取决于瓦片地图包含的属性和方法以及图层应该能够知道和访问的内容。如果瓦片贴图具有DeleteAllLayers方法,并且图层不应该能够调用它,则图层无法直接访问其父项。

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

将属性传递给构造函数(2)是类似的到(4),但更详细和更少的面向对象。当你有1或2个属性时很好,但有很多属性会变得丑陋和难以维护。

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

我不明白(3)。 ref关键字如何更改(2)?它只允许被调用者更改调用者传递的变量的值。或者你是指具有参考类型的对象?

另一种解决方案

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

+0

你是对的,属性是不可变的,它们是int的,所以它们是复制的,这就是为什么我写这部分(应该更加精确)“,但它们基本上成为图层属性(又名它们是每个图层的不同对象)”。有了ref,我想给图层提供参考,所以当我在地图上改变它们时,它们会在图层中发生变化。您的界面建议听起来很有趣,可能是最好的解决方案。 –

+0

我结束了使用选项4 – TruthOf42

0

选项2将适用于您正在尝试执行的操作,并且您可能不需要包含'ref'关键字。 我很好奇,你想从子类中访问什么样的数据成员?如果他们是集合,那么你可能不需要'ref'关键字。 另一种选择是将父类设为静态,但我不确定这是否是您要查找的结果。你能一次加载多个瓷砖地图吗?如果不是,请考虑静态类选项。

+0

'static'在这里完全没有必要。即使 - 现在 - 一次只有一张地图,这可能会稍后改变,并需要大量更改。除非确实需要,否则应该避免单身。 –

+0

谢谢你对此的扩展。我明白这不是最好的选择,但如果Biene以后不担心修改代码,那么这将是一个选择。 – Th3BFG

0

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

+0

这听起来更像我1。我想避免这可能带来的问题的原因。 –