2011-09-14 16 views
4
foreach(PlayerBase p in Members) 
{ 
    p.Render(); 
} 

MembersリストはタイプFieldPlayerまたはGoalKeeperのメンバーが含まれています。 FieldPlayerおよびGoalKeeperPlayerBaseを継承します。 p.Render()に電話するときは、FieldPlayerまたはGoalKeeperに呼び出される適切なRenderコールが必要です。それ、どうやったら出来るの?型鋳造質問

おかげ

答えて

5

あなたはPlayerBase.Render方法virtualを作ります。詳細については、this questionを参照してください。

3

あなたはPolymorphismについて話しています。 Renderの適切な実装が自動的に呼び出されます。 PlayerBaseクラスのRenderメソッドがabstractまたはvirtualのいずれかであることを確認してください。

1

FieldPlayerおよびGoalKeeperoverrideRenderメソッドの場合、これは自動的に発生します。

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

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

Rendervirtual memberある場合、呼び出されるメソッドは、実行時にオブジェクトの最も派生型でそのなります。

0

PlayerBaseRenderは、virtual(デフォルト実装の場合)またはabstractのいずれかにする必要があります。次に、希望の動作を持つ子クラスのメソッドoverrideを実行します。

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

PlayerBaseはレンダリング機能を実装する必要があります継承するクラスを。あなたがレンダリングのための共通の機能を持っている場合は、代わりにすることができます:あなたのサブクラスで次に

abstract class PlayerBase 
{ 
    public virtual void Render() { 
     // add common functionality 
    } 
} 

は、FieldKeeperを言う:

class FieldKeeper : PlayerBase { 
    public override void Render() { 
     // add additional functionality 
     base.Render(); 
    } 
} 
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"); 
    } 
} 

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は、3つのすべてのインスタンスの場合

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"); 
    } 
} 

virtual機能を持つクラスである場合は、派生型のRender関数が呼び出されます。