Тип кастинга вопрос
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
а также GoalKeeper
override
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();
}
}