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.
}
由于
答案 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);
}
}