从派生类访问字段
本文关键字:字段 访问 派生 | 更新日期: 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
}