2016-02-03 76 views
1

我试图从持有对基类的引用的数组中的派生类访问字段。来自派生类的访问字段

我有三类:

abstract GameObjectBase 
{ 

} 

和来自是:

public Gamespace: GameObjectBase 
{ 
    private bool containsItem; 
} 

和:

public GameWall: GameObjectBase 
{ 
} 

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

我已创建从这些对象阵列,这样

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

然后我填充Gamespaces和Gamewalls所述阵列。但是,当我访问数组中的Gamespace对象时,containsItem字段由于引用了GameObjectBase类型的对象而无法访问。

很明显,我可以把containsItem放在GameObjectBase中,并从那里访问它,但这不适合我的OOP方法。我发现的唯一的其他解决方案是明确地将该对象投射到Gamespace

这似乎很粗糙,容易出错。有没有更好的解决方案?

+0

如何访问Gamespace对象(代码)? – DanielVorph

+0

在这种情况下将其推入基地有什么问题? Gamewall实现在调用时始终返回false是完全正确的 – jglouie

回答

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 
}