【问题标题】:Type casting question类型转换问题
【发布时间】:2011-11-17 06:43:37
【问题描述】:
foreach(PlayerBase p in Members)
{
    p.Render();
}

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

谢谢

【问题讨论】:

    标签: c# oop inheritance polymorphism


    【解决方案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 函数。

    【讨论】:

      【解决方案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();
          }
      }
      

      【讨论】:

        【解决方案3】:

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

        更多信息请参见:http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              如果FieldPlayerGoalKeeper override Render 方法,那么这将自动发生。

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

              【讨论】:

                【解决方案7】:

                你说的是Polymorphism。自动调用Render 的正确实现。确保 PlayerBase 类中的 Render 方法定义为 abstractvirtual

                【讨论】:

                  【解决方案8】:

                  您将PlayerBase.Render 方法设为virtual。请参阅this question 了解更多信息。

                  【讨论】:

                    猜你喜欢
                    • 2012-10-01
                    • 2010-12-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多