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

本文关键字:成员 访问 对象 类型 | 更新日期: 2023-09-27 18:08:48

PlayerBase是FieldPlayer和守门员的基类。我在FieldPlayer和守门员中有statemmachine成员。但是在MyList中,FieldPlayer和守门员都被视为PlayerBase。如何确保获得正确类型的statemmachine ?我是否应该先检查类型,然后再进行类型转换?

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

谢谢

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

成员应该在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
}

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

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);
    }
}