我有一个问题,我有一个类的列表(DrawableGameComponent),其中包含从DrawableGameComponent继承的不同类型类的许多实例。
我想从其中一个类中访问变量,但由于它们被声明为DrawableGameComponent,因此我无法访问除DrawableGameComponent之外的任何其他变量。
主要课程:
List<DrawableGameComponent> entities = new List<DrawableGameComponent>();
“玩家”类:
public Color color;
public int score;
我是如何从主类中访问这些变量的?
答案 0 :(得分:2)
如果DrawableGameComponent
是Player
的基础,您可以执行此操作:
foreach(DrawableGameComponent entity in entities)
{
Player player = entity as Player;
if(player != null)
{
Color col = player.color;
int score = player.score;
}
}
因为'是','as'和铸造相对昂贵,所以最好只做一次 - 如上所述。
答案 1 :(得分:1)
Ryan P有权利。如果您确定Player派生自DrawableGameComponent,您可以将DrawableGameComponent的实例转换为Player,如上所示。
但是,请考虑其中一些DrawableGameComponent实例可能不是Player。或许也许是敌人。您没有具体说明您正在使用该实例做什么,但这种向下转换通常代表设计问题。
需要考虑的事情。
答案 2 :(得分:1)
看起来你的继承模型是错误的:如果一个变量(我假设你的例子中的颜色)在所有/大多数派生类(如玩家,机器人,对手等)中声明,它应该在基类中声明。不使用Color的派生类可以忽略它
答案 3 :(得分:0)
假设这些类在同一个项目(范围)中,您可以使用以下内容:
if (dgc is Player)
{
(dgc as Player).color = Colors.Red;
}
答案 4 :(得分:0)
简短的回答是
if(entity[0] is Player)
{
((Player)entity[0]).color
}
答案 5 :(得分:0)
如果要访问继承类中定义的属性,则需要将其强制转换为该类型。 DrawableGameComponent 类型实例只能公开其中的属性(或者它从例如system.object继承的任何类型)
所以如果你有以下内容:
class Player : DrawableGameComponent
{
public int MyWidth { get; set; }
}
然后,只有拥有Player实例时才能访问MyWidth属性:
Player playerObj = dgcObj as Player;
if (playerObj != null) Console.Write(playerObj.MyWidth);
以下情况不起作用:
DrawableGameComponent dgcObj = new Player();
dgcObj.MyWidth // no such property
答案 6 :(得分:0)
我假设你知道你可以投这样的东西:
Player p = (Player)entities[0];
所以我认为你有一个设计问题。您始终可以使用is
运算符来确定实体是否为Player
,但如果您正在进行过多的RTTI,则可能会遇到问题。如果只是这一个例子,铸造是一个很好的选择,因为它是必要的。