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是完全正确的