Тип кастинга вопрос

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

Members список содержит членов типа FieldPlayer или же GoalKeeper, FieldPlayer а также GoalKeeper наследовать от PlayerBase, Когда я звоню p.Render()Мне нужен соответствующий Render призыв к вызову FieldPlayer или же GoalKeeper, Как я могу это сделать?

Спасибо

8 ответов

Вы делаете PlayerBase.Render метод virtual, Смотрите этот вопрос для получения дополнительной информации.

Вы говорите о полиморфизме. Правильная реализация Render автоматически вызывается. Убедитесь, что метод Render в вашем PlayerBase класс определяется как abstract или же virtual,

Если 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 функция будет вызвана.

Если FieldPlayer а также GoalKeeperoverride Render метод, то это произойдет автоматически.

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

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

Вы можете отметить Render как abstract и тогда каждый производный класс должен его реализовать.

См. Это для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

Если Render является виртуальным членом, то вызываемый метод будет таким, как для самого производного типа объекта во время выполнения.

Вы должны объявить Render на PlayerBase быть либо virtual (если у вас есть реализация по умолчанию) или abstract, Затем вы override метод в дочерних классах с желаемым поведением.

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();
    }
}
Другие вопросы по тегам