C# 从派生类访问字段

C# 从派生类访问字段,c#,arrays,oop,reference,polymorphism,C#,Arrays,Oop,Reference,Polymorphism,我试图从包含基类引用的数组中的派生类访问字段 我有三门课: abstract GameObjectBase { } 并由此得出以下结论: public Gamespace: GameObjectBase { private bool containsItem; } 以及: (显然,这些类包含更多的数据、方法和构造函数) 我已经从这些对象创建了一个数组,如下所示 private GameObjectBase[,] _labyrinthArray = new GameObjectB

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

我有三门课:

abstract GameObjectBase 
{

}
并由此得出以下结论:

public Gamespace: GameObjectBase
{
     private bool containsItem;
}
以及:

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

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

private GameObjectBase[,] _labyrinthArray = new GameObjectBase[10,10];
然后我用游戏空间和游戏墙填充这个数组。但是,当我访问数组中的Gamespace对象时,由于对象的引用类型为GameObjectBase,因此无法访问
containsItem
字段

显然,我可以将
containsItem
放在GameObjectBase中,并从那里访问它,但这不适合我的OOP方法。我发现的唯一其他解决方案是将有问题的对象明确地投射到
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
}
var gameObject=\u数组[i,j]//i、 j在别处定义
var mayContainItem=游戏对象作为游戏对象;
如果(MayContaineItem!=null)
{
var itemExists=mayContainItem.ContainsItem;

//MayContaineItem.ContaineSitem=false;//首先,您不能从对象类本身之外引用私有字段。您可能希望使用只读属性来封装该字段。如果您不想将对象显式强制转换为
游戏空间
,则可以使用接口

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
}
var gameObject=\u数组[i,j];//在别处定义的i,j
var mayContainItem=游戏对象作为游戏对象;
如果(MayContaineItem!=null)
{
var itemExists=mayContainItem.ContainsItem;

//MayContaineItem.ContaineSitem=false;//如何访问游戏空间对象(代码)?在这种情况下将其推入基础中有什么错?如果调用Gamewall实现,则始终返回false是完全正确的。如何访问游戏空间对象(代码)?在这种情况下,将其推到基础中有什么不对?如果调用Gamewall实现,它总是返回false是完全正确的