输入铸造问题

时间:2011-09-14 18:25:25

标签: c# oop inheritance polymorphism

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

Members列表包含FieldPlayerGoalKeeper类型的成员。 FieldPlayerGoalKeeper继承自PlayerBase。当我拨打p.Render()时,我需要为RenderFieldPlayer拨打相应的GoalKeeper来电。我该怎么做?

由于

8 个答案:

答案 0 :(得分:5)

您制作了PlayerBase.Render方法virtual。有关详细信息,请参阅this question

答案 1 :(得分:3)

你在谈论Polymorphism。自动调用Render的正确实现。确保PlayerBase类中的渲染方法定义为abstractvirtual

答案 2 :(得分:1)

如果FieldPlayerGoalKeeper override Render方法,则会自动生成。

public abstract class PlayerBase
{
    public virtual void Render();
}

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

答案 3 :(得分:1)

如果PlayerBaseinterface

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

如果PlayerBaseabstract

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函数。

答案 4 :(得分:0)

如果Rendervirtual member,则调用的方法将是运行时对象的最派生类型。

答案 5 :(得分:0)

您应该在Render上声明PlayerBasevirtual(如果您有默认实施)或abstract。然后,您override具有所需行为的子类中的方法。

答案 6 :(得分:0)

您可以将Render标记为abstract,然后每个派生类都必须实现它。

有关详情,请参阅此处:http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

答案 7 :(得分:0)

abstract class PlayerBase
{
    public abstract void Render();
}

任何继承PlayerBase的类都需要实现Render函数。如果您具有渲染的常用功能,则可以改为:

abstract class PlayerBase
{
    public virtual void Render() {
        // add common functionality
    }
}

然后在您的子类中,说FieldKeeper

class FieldKeeper : PlayerBase    {
    public override void Render() {
        // add additional functionality
        base.Render();
    }
}