2

仮想メソッドとオーバーライドを使用すると、期待どおりに動作しないサンプル コードを次に示します。なんで?

main()
{
    Child c = new Child();
    c.Trigger = new Trigger();
}

public class Parent
{
    public Trigger _trigger;

    public Trigger Trigger
    {
        set 
        {
            _trigger = value;
            _trigger.TriggerEvent += Trigger.TriggerHandler(OnTrigger);
        }
    }

    internal virtual void OnTrigger(int type)
    {
        Write("I don't want to write this!");
    }
}

public class Child : Parent
{
    internal override void OnTrigger(int type)
    {
        Write("I want this to be written, but it's not.");
    }
}

親のイベントをサブスクライブするメソッド「OnTrigger」はオーバーライドされません。親でサブスクライブされているイベントに子のメソッドを実行させる方法は?

4

2 に答える 2

0

次のコードはあなたが望むものですか?

    public class Trigger
    {
        public event Action TriggerEvent;

        public void NotifyTrigger()
        {
            this.TriggerEvent();
        }
    }

    public class Parent
    {
        public Trigger _trigger;

        public Trigger Trigger
        {
            get
            {
                return _trigger;
            }

            set
            {
                _trigger = value;
                _trigger.TriggerEvent += this.OnTrigger;
            }
        }

        internal virtual void OnTrigger()
        {
            Debug.WriteLine("I don't want to write this!");
        }
    }

    public class Child : Parent
    {
        internal override void OnTrigger()
        {
            Debug.WriteLine("I want this to be written, but it's not.");
        }
    }

    [Test]
    public void testetst() // Or Main
    {
        Child c = new Child();
        c.Trigger = new Trigger();
        c.Trigger.NotifyTrigger();
    }

それは私のために働いています。出力は次のとおりです。「これを書きたいのですが、そうではありません。」

于 2013-11-12T14:34:06.060 に答える
0

他の場所で問題を見つけました。この場合、Child1.Trigger は Child 子インスタンスに影響を与えるはずですが、child.Trigger.NotifyTrigger() を呼び出す代わりに (Yohanes の例を使用)、独自の (this.Trigger.NotifyTrigger) を呼び出しました。Child1 は OnTrigger をオーバーライドしていません!

于 2013-11-12T15:17:50.650 に答える