根据对象类型访问正确的成员

时间:2011-09-17 20:07:17

标签: c#

PlayerBase是FieldPlayer和GoalKeeper的基类。我在FieldPlayer和GoalKeeper中有stateMachine memeber。但在MyList中,FieldPlayer和GoalKeeper都被视为PlayerBase。我如何确保获得正确类型的stateMachine?我应该以某种方式检查类型然后进行类型转换?

foreach (PlayerBase p in MyList)
{
 // Here I need to access p.stateMachine for FieldPlayer or GoalKeeper, depends what p is.
}

由于

2 个答案:

答案 0 :(得分:2)

该成员应在PlayerBase中声明为属性。也许这是一个抽象的声明,或者至少是一个虚拟声明。如果属性需要除默认行为之外的其他内容,则可以在派生类中覆盖该属性。

abstract class PlayerBase
{
    public abstract TheType StateMachine { get; set; }  // declare here

    // if PlayerBase is not abstract, you can declare the property as: 
    // public virtual TheType StateMachine { get; set; }
}

class FieldPlayer : PlayerBase 
{
    public override TheType StateMachine { get; set; } // implement here
}

通常不希望在处理基本类型的代码中进行类型检查。更多指定(或派生)类型应该能够直接替换基础而不需要代码关注。

答案 1 :(得分:0)

foreach (PlayerBase p in MyList)
{
    var fp = p as FieldPlayer;
    if (fp != null)
    {
        // p is a FieldPlayer => you can access the stateMachine property
        Console.WriteLine(fp.stateMchine);
    }
}