从子类访问父属性的最佳方法

时间:2013-07-05 15:13:43

标签: c# parent-child relationship

我正在使用磁贴编辑器。在编辑器中,您可以加载平铺贴图。每个图块地图可以具有多个图层。平铺贴图具有其图层的列表。我现在需要图层类中的图块地图属性(例如图块宽度/高度等)。我现在问自己,最好的办法是什么。

  1. 我可以通过在图层类中引入tilemap属性来建立双向关系,这样我就可以从那里访问我需要的所有内容。但那时我必须关注这段关系的两个方面。

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

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

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

  5. 所以任何建议/提示都将不胜感激。

3 个答案:

答案 0 :(得分:1)

双向关联(1)可能没有问题,具体取决于图块地图包含的属性和方法以及图层应该能够知道和访问的内容。如果图块地图具有DeleteAllLayers方法且图层无法调用它,则图层无法直接访问其父图层。

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

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

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

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

另一种解决方案

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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