foreach(PlayerBase p in Members)
{
p.Render();
}
Members
列表包含FieldPlayer
或GoalKeeper
类型的成员。 FieldPlayer
和GoalKeeper
继承自PlayerBase
。当我拨打p.Render()
时,我需要为Render
或FieldPlayer
拨打相应的GoalKeeper
来电。我该怎么做?
由于
答案 0 :(得分:5)
您制作了PlayerBase.Render
方法virtual
。有关详细信息,请参阅this question。
答案 1 :(得分:3)
你在谈论Polymorphism。自动调用Render
的正确实现。确保PlayerBase
类中的渲染方法定义为abstract
或virtual
。
答案 2 :(得分:1)
如果FieldPlayer
和GoalKeeper
override
Render
方法,则会自动生成。
public abstract class PlayerBase
{
public virtual void Render();
}
public class FieldPlayer : PlayerBase
{
public override void Render() {...}
}
答案 3 :(得分:1)
如果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
函数。
答案 4 :(得分:0)
如果Render
是virtual member,则调用的方法将是运行时对象的最派生类型。
答案 5 :(得分:0)
您应该在Render
上声明PlayerBase
为virtual
(如果您有默认实施)或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();
}
}