从派生类

时间:2016-02-03 23:50:02

标签: c# arrays oop reference polymorphism

我试图从包含对基类的引用的数组中的派生类访问字段。

我有三个班级:

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

这看起来很粗糙,而且容易出错。有没有更好的解决方案?

1 个答案:

答案 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
}