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

C# 从子类访问父属性的最佳方法,c#,parent-child,relationship,C#,Parent Child,Relationship,我正在做一个平铺编辑器。在编辑器中,可以加载平铺贴图。每个平铺贴图可以有多个图层。平铺贴图具有其图层的列表。我现在需要图层类中的平铺贴图属性(例如,平铺宽度/高度)。我现在问自己什么是最好的方法 我可以通过在layer类中引入tilemap属性来建立双向关系,这样我就可以从那里访问我需要的一切。但我必须照顾好这段关系的两个方面 我可以用构造函数为layer类提供所有需要的属性,但是它们基本上变成了layer属性(也就是说,它们对于每个层都是不同的对象) 与2相同,但使用“ref”参数为图层提供属

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

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

  • 我可以用构造函数为layer类提供所有需要的属性,但是它们基本上变成了layer属性(也就是说,它们对于每个层都是不同的对象)

  • 与2相同,但使用“ref”参数为图层提供属性

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


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

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

    < P>我认为选项是3更好。您可以将父类的引用传递给子类,并可以直接访问所有公共属性。我建议这样做更好,因为无论是从
    ChildClass
    还是
    ParentClass
    进行任何更改,所有其他
    层都将继承这些更改。

    双向关联(1)可能可以,也可能不行,取决于平铺贴图包含的属性和方法以及图层应该能够知道和访问的内容。如果平铺贴图具有
    DeleteAllLayers
    方法,并且层不能调用该方法,则层不能直接访问其父层

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

    将属性传递给构造函数(2)与(4)类似,但更详细,更不面向对象。当你有一个或两个属性时,这是很好的,但是如果有更多的属性,它会变得丑陋和无法维护

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

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

    另一种解决方案


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

    静态
    在这里是完全不必要的。即使——就目前而言——一次只有一张地图,这可能会在以后发生变化,需要进行大量的更改。除非真的有必要,否则应该避免单身。感谢您对此进行扩展。我知道这不是最好的选择,但如果Biene不担心以后修改代码,这将是一个选择。你是对的,属性是不可变的,它们是int,所以它们是copy,这就是我写这部分的原因(应该更精确些)“但它们基本上变成了层属性(也就是说,每一层都是不同的对象)。使用ref时,我希望将INT的引用提供给图层,因此当我在地图中更改INT时,它们在图层中也会更改。您的界面建议听起来很有趣,可能是最佳解决方案。我最终使用了选项4,这对我来说更像1。我希望避免这可能带来的问题.