0

CombatMgrというクラスがあり、その中にいくつかの異なる関数があります。これらの関数が呼び出されたら、CombatMgrを継承する他のクラスにも同じ関数を持たせ、その中で呼び出されるようにします。

    //Main class
    public class CombatMgr
    {
        public void EnterCombat()
        {
             //This gets called as CombatMgr.EnterCombat();
        }
    }

    //Side class
    public class RogueCombat : CombatMgr
    {
        public void EnterCombat()
        {
             //I want this function to be 
             //linked to the EnterCombat function from CombatMgr.
             //And called when the main function is called.
        }
    }

このように機能するコードが必要です...CombatMgr.EnterCombat()を呼び出すと、アクティブなすべての子クラスがEnterCombat()関数を起動する必要があります。つまり、Event OnCombatのように、すべてのリスナーは継承する子クラスです。

4

5 に答える 5

3
//Side class
public class RogueCombat : CombatMgr
{
    public override void EnterCombat()
    {
         base.EnterCombat();
         //....
    }
}

CombatMgr ではなく、RogueCombat インスタンスを使用する必要があります。</p>

于 2012-05-21T06:16:21.323 に答える
2

基本クラスのメソッドを仮想として作成し、子クラスでオーバーライドする必要があります

//Main class
public class CombatMgr
{
    public virtual void EnterCombat()
    {
         //This gets called as CombatMgr.EnterCombat();
    }
}

//Side class
public class RogueCombat : CombatMgr
{
    public override void EnterCombat()
    {
         //I want this function to be 
         //linked to the EnterCombat function from CombatMgr.
         //And called when the main function is called.
    }
}

質問のコメントセクションであなたが言ったように、あなたは行動のようなイベントが欲しいと言っています。その後、あなたは以下を行うことができます

 //Main class
public class CombatMgr
{
    public void EnterCombat()
    {
        // write logic here you want to execute for every child instance.
        // then call the virtual protected method.
        this.OnEnterCombat();
    }

    protected virtual void OnEnterCombat() { }
}

//Side class
public class RogueCombat : CombatMgr
{
    protected override void OnEnterCombat()
    {
        // Write logic for child class here
    }
}

また、フォローしないでください

CombatMgr cb1 = new RogueCombat();
        CombatMgr cb2 = new RogueCombat();

        cb1.EnterCombat(); //  calling this will also call the OnEnterCombat() method for intance cb1 not for cb2
于 2012-05-21T06:12:02.413 に答える
1

たぶん私は間違っているかもしれませんが、「メイン関数」が「メイン関数」であることが理にかなっているCombatMgrクラスのものであると仮定すると、あなたがやりたいことは次のとおりだと思います...

public class CombatMgr
{
    // Delegate and Event
    public delegate void Combat();
    public event Combat OnEnterCombat;

    // Your main function
    public void EnterCombat()
    {
        // Calling event, and all subscribers to it
        if (OnEnterCombat != null)
        {
            OnEnterCombat();
        }
    }
}

// Side Class 1
public class RogueCombat : CombatMgr
{
    public void EnterCombat()
    {
        Console.WriteLine("Rogue Combats");
    }
}

次に、次のように使用します。

CombatMgr manager = new CombatMgr();

// Suscribing a Rogue combat
manager.OnEnterCombat += () => 
{
    RogueCombat rogue = new RogueCombat();
    rogue.EnterCombat();
};

manager.EnterCombat();
于 2012-05-21T06:49:25.103 に答える
0

あなたが達成しようとしていることを正しく理解しているかどうかはよくわかりません。とにかく、RogueCombat は CombatMgr から派生する必要がありますか? RogueCombat は CombatMgr から何を継承していますか? メソッドの名前と、それらが同時に呼び出されるという事実だけですか?

クラスのインスタンスは、その派生クラスのインスタンスとはまったく関係がないことに注意してください。そのため、コレクションまたはイベントを使用して、基本クラス内でこれらのインスタンスを追跡する必要があります。

Alfonso のコードは RogueCombat の既存のインスタンスでは機能しないため機能しませんが、CombatMgr で EnterCombat が呼び出されるたびに新しいインスタンスを作成します。機能させるには、派生クラスのインスタンスが作成されたらすぐに、基本クラスのイベントに登録する必要があります。次のようにコンストラクターでこれを行うことができます。

public class RogueCombat : CombatMgr
{
    public RogueCombat(CombatMgr aMgr)
    {
        aMgr.OnEnterCombat += new Combat(EnterCombat);
    }

    public void EnterCombat()
    {
        Console.WriteLine("Rogue Combats");
    }
}

これが機能するには、RogueCombat のインスタンスを作成するたびに CombatMgr のインスタンスを渡す必要があります。システムのすべてのポイントからアクセスできる CombatMgr の単一のインスタンス (CombatMgr.Current など) がある場合、これは必要ありません。

于 2012-05-21T07:43:02.037 に答える
0

基本クラスで関数を仮想としてマークし、継承されたクラスでオーバーライドする必要があります。

//Main class
public class CombatMgr
{
    public virtual void EnterCombat()
    {
         //This gets called as CombatMgr.EnterCombat();
    }
}

//Side class
public class RogueCombat : CombatMgr
{
    public override void EnterCombat()
    {
         //I want this function to be 
         //linked to the EnterCombat function from CombatMgr.
         //And called when the main function is called.
    }
}

詳細については、http: //msdn.microsoft.com/en-us/library/9fkccyh4.aspxを参照してください。

于 2012-05-21T06:13:04.200 に答える