【问题标题】:Type casting question类型转换问题
【发布时间】:2011-11-17 06:43:37
【问题描述】:
foreach(PlayerBase p in Members)
{
p.Render();
}
Members 列表包含 FieldPlayer 或 GoalKeeper 类型的成员。 FieldPlayer 和 GoalKeeper 继承自 PlayerBase。当我调用p.Render() 时,我需要为FieldPlayer 或GoalKeeper 调用适当的Render 调用。我该怎么做?
谢谢
【问题讨论】:
标签:
c#
oop
inheritance
polymorphism
【解决方案1】:
如果PlayerBase 是interface
public inteface IPlayerBase
{
void Render();
}
public class FieldPlayer : IPlayerBase
{
public void Render()
{
MessageBox.Show("FieldPlayer.Render");
}
}
public class GoalKeeper : IPlayerBase
{
public void Render()
{
MessageBox.Show("GoalKeeper.Render");
}
}
如果PlayerBase 是abstract 类
public abstract class PlayerBase
{
public abstract void Render();
}
public class FieldPlayer : PlayerBase
{
public override void Render()
{
MessageBox.Show("FieldPlayer.Render");
}
}
public class GoalKeeper : PlayerBase
{
public override void Render()
{
MessageBox.Show("GoalKeeper.Render");
}
}
如果PlayerBase 是具有virtual 函数的类
public class PlayerBase
{
public virtual void Render()
{
MessageBox.Show("PlayerBase.Render");
}
}
public class FieldPlayer : PlayerBase
{
public override void Render()
{
MessageBox.Show("FieldPlayer.Render");
}
}
public class GoalKeeper : PlayerBase
{
public override void Render()
{
MessageBox.Show("GoalKeeper.Render");
}
}
对于所有三个实例,将调用派生类型的 Render 函数。
【解决方案2】:
abstract class PlayerBase
{
public abstract void Render();
}
任何继承 PlayerBase 的类都需要实现 Render 函数。如果您有 Render 的通用功能,则可以:
abstract class PlayerBase
{
public virtual void Render() {
// add common functionality
}
}
然后在你的子类中,说FieldKeeper:
class FieldKeeper : PlayerBase {
public override void Render() {
// add additional functionality
base.Render();
}
}
【解决方案4】:
您应该将PlayerBase 上的Render 声明为virtual(如果您有默认实现)或abstract。然后,您 override 子类中的方法具有所需的行为。
【解决方案6】:
如果FieldPlayer 和GoalKeeper override Render 方法,那么这将自动发生。
public abstract class PlayerBase
{
public virtual void Render();
}
public class FieldPlayer : PlayerBase
{
public override void Render() {...}
}
【解决方案7】:
你说的是Polymorphism。自动调用Render 的正确实现。确保 PlayerBase 类中的 Render 方法定义为 abstract 或 virtual。