类型转换问题

4
foreach(PlayerBase p in Members)
{
    p.Render();
}

Members列表包含FieldPlayerGoalKeeper类型的成员。 FieldPlayerGoalKeeper继承自PlayerBase。当我调用p.Render()时,需要为FieldPlayerGoalKeeper调用适当的Render方法。我该怎么做?

谢谢

8个回答

5

您需要将PlayerBase.Render方法设置为virtual。有关更多信息,请参见此问题


3
你在谈论多态性。正确实现Render会自动调用。请确保你的PlayerBase类中的Render方法被定义为abstractvirtual

1
如果 FieldPlayerGoalKeeper 重写了 Render 方法,那么这将自动发生。
public abstract class PlayerBase
{
    public virtual void Render();
}

public class FieldPlayer : PlayerBase
{
    public override void Render() {...}
}

1
如果PlayerBase是一个接口
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是一个抽象类。
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是一个带有虚函数的类
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函数将被调用。


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

0
如果Render是一个虚成员,那么在运行时调用的方法将是对象最派生类型上的方法。

0
你应该在 PlayerBase 上声明 Rendervirtual(如果你有一个默认实现)或者 abstract。然后,在子类中使用 override 方法来实现所需的行为。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接