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

本文关键字:获取 变量 继承 | 更新日期: 2023-09-27 18:25:46

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

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

主要类别:

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

"玩家"等级:

public Color color;
public int score;

知道如何从主类访问这些变量吗?

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

如果DrawableGameComponentPlayer的基础,则可以执行以下操作:

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

因为"is"、"as"和铸造相对昂贵,所以最好只做一次——如上所述。

Ryan p掌握了它的权利。如果你确定Player派生自DrawableGameComponent,你可以将DrawableGameComponents的实例强制转换为Player,如上所示。

然而,请考虑其中一些DrawableGameComponent实例可能不是Player。例如,也许是敌人。你没有具体说明你对实例做了什么,但这种向下转换通常代表一个设计问题。

只是一些需要考虑的事情。

您的继承模型似乎是错误的:如果一个变量(我在您的示例中假设为Color)在所有/大多数派生类(如播放器、机器人、对手等)中声明,那么它应该在基类中声明。不使用Color的派生类可以忽略它

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

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

简短的答案是

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

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

Player p = (Player)entities[0];

所以我认为你有一个设计问题。你总是可以使用is运算符来判断实体是否是Player,但如果你有太多的RTTI,你可能会遇到问题。如果只是这一个例子,强制转换是一个很好的选择,因为这是必要的。

如果要访问继承类中定义的属性,则需要将其强制转换为该类型DrawableGameComponent类型实例只能公开其中的属性(或从system.object继承的任何类型)

因此,如果你有以下内容:

class Player : DrawableGameComponent  
{  
  public int MyWidth { get; set; }  
} 

然后,只有当你有一个播放器实例时,你才能访问MyWidth属性:

Player playerObj = dgcObj as Player;  
if (playerObj != null) Console.Write(playerObj.MyWidth);

而以下方法不起作用:

DrawableGameComponent dgcObj = new Player();  
dgcObj.MyWidth // no such property