繁体   English   中英

从c#中的继承类中获取变量

[英]Getting variables from inherited class in c#

我有一个问题,我有一个类(DrawableGameComponent)的列表,其中包含从DrawableGameComponent继承的不同类型的类的许多实例。

问题是我想从其中一个类中访问变量,但由于它们被声明为DrawableGameComponent,因此我无法访问除DrawableGameComponent之外的任何其他变量。

主要课程:

List<DrawableGameComponent> entities = new List<DrawableGameComponent>();

“玩家”类:

public Color color;
public int score;

我是如何从主类中访问这些变量的?

如果DrawableGameComponentPlayer基础,你可以这样做:

foreach(DrawableGameComponent entity in entities)
{
    Player player = entity as Player;
    if(player != null)
    {
        Color col = player.color;
        int score = player.score;
    }
}

因为'是','as'和铸造相对昂贵,所以只需要做一次 - 如上所述。

Ryan P有权利。 如果你确定Player派生自DrawableGameComponent,你可以将DrawableGameComponent的实例转换为Player,如上所示。

但是,请考虑其中一些DrawableGameComponent实例可能不是Player。 或许也许是敌人。 您没有具体说明您正在使用该实例做什么,但这种向下转换通常代表一个设计问题。

只是需要考虑的事情。

看起来你的继承模型是错误的:如果一个变量(我假设你的例子中的颜色)在所有/大多数派生类(如玩家,机器人,对手等)中声明,它应该在基类中声明。 不使用Color的派生类可以忽略它

假设这些类在同一个项目(范围)中,您可以使用以下内容:

if (dgc is Player)
{
    (dgc as Player).color = Colors.Red;
}

简短的回答是

if(entity[0] is Player)
{
   ((Player)entity[0]).color
}

如果要访问继承类中定义的属性,则需要将其强制转换为该类型。 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 

我假设你知道你可以投这样的东西:

Player p = (Player)entities[0];

所以我认为你有一个设计问题。 你总是可以使用is运算符来确定实体是否是一个Player但是如果你正在进行太多的RTTI,你最终可能会遇到问题。 如果只是这一个例子,铸造是一个很好的选择,因为它是必要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM