根据对象类型访问正确的成员
本文关键字:成员 访问 对象 类型 | 更新日期: 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);
}
}