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

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

4 голосов
/ 14 сентября 2011
foreach(PlayerBase p in Members)
{
    p.Render();
}

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

Спасибо

Ответы [ 8 ]

5 голосов
/ 14 сентября 2011

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

3 голосов
/ 14 сентября 2011

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

1 голос
/ 14 сентября 2011

Если 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 производного типа.

1 голос
/ 14 сентября 2011

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

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

public class FieldPlayer : PlayerBase
{
    public override void Render() {...}
}
0 голосов
/ 14 сентября 2011
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 голосов
/ 14 сентября 2011

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

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

0 голосов
/ 14 сентября 2011

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

0 голосов
/ 14 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...