我试图从包含对基类的引用的数组中的派生类访问字段。
我有三个班级:
abstract GameObjectBase
{
}
从中得出:
public Gamespace: GameObjectBase
{
private bool containsItem;
}
和
public GameWall: GameObjectBase
{
}
(显然这些类包含更多数据,方法和构造函数)。
我已经从这些对象创建了一个数组,比如这个
private GameObjectBase[,] _labyrinthArray = new GameObjectBase[10,10];
然后我用Gamespaces和Gamewalls填充所述数组。但是当我访问数组中的Gamespace对象时,由于对GameObjectBase类型的对象的引用,containsItem
字段不可访问。
显然我可以将containsItem
放在GameObjectBase中并从那里访问它,但这并不适合我的OOP方法。我发现的唯一其他解决方案是明确地将问题转换为Gamespace
。
这看起来很粗糙,而且容易出错。有没有更好的解决方案?
答案 0 :(得分:0)
首先,您无法从对象类本身外部引用私有字段。您可能希望使用只读属性来封装字段。如果您不想明确地将对象强制转换为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
}