从派生类访问字段

本文关键字:字段 访问 派生 | 更新日期: 2023-09-27 18:33:04

我正在尝试访问数组中派生类的字段,该数组包含对基类的引用。

我有三节课:

abstract GameObjectBase 
{
}

由此衍生出的是:

public Gamespace: GameObjectBase
{
     private bool containsItem;
}

和:

public GameWall: GameObjectBase
{
}

(显然,这些类包含更多的数据、方法和构造函数)。

我从这些对象创建了一个数组,如下所示

private GameObjectBase[,] _labyrinthArray = new GameObjectBase[10,10];

然后我用游戏空间和游戏墙填充所述数组。但是当我访问数组中的游戏空间对象时,由于引用了对象类型为 GameObjectBase 而无法访问containsItem字段。

显然,我可以containsItem放在GameObjectBase中,并从那里访问它,但这不符合我的OOP方法。我找到的唯一其他解决方案是将有问题的对象显式转换为Gamespace

这对我来说似乎很粗糙且容易出错。有没有更好的解决方案?

从派生类访问字段

首先,您不能从对象类本身外部引用私有字段。您可能希望使用只读属性来封装字段。如果您不想将对象显式转换为Gamespace,则可以改用接口。

public interface ICanContainItem
{
    bool ContainsItem { get; }
}
public class Gamespace : GameObjectBase, ICanContainItem
{
    private bool _containsItem;
    public bool ContainsItem
    {
        get { return _containsItem; }
        private set { _containsItem = value; }
    }
}

这样,您就可以通过界面检查对象是否"可以包含项目"。即使将来添加可以包含项的新类型的空格,如果新类型也实现相同的接口,则相同的代码段也有效。

var gameObject = _labyrinthArray[i,j]; //i,j defined elsewhere
var mayContainItem = gameObject as ICanContainItem;
if (mayContainItem != null)
{
    var itemExists = mayContainItem.ContainsItem;
    //mayContainItem.ContainsItem = false; //<-- fails because there's no setter
}