0

C# では、コンストラクター、継承、およびイベント サブスクリプションに問題があるようです。

次の C# プログラムを検討してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventTest
{
    public class Widget
    {
        public delegate void MyEvent();
        public event MyEvent myEvent;

        public void SetEvent()
        {
            myEvent();
        }
    }

    public class Base
    {
        Widget myWidget;

        protected Base() { }

        protected Base(Widget awidget)
        {
            myWidget = awidget;
            myWidget.myEvent += myEvent;
        }

        public void myEvent() { }
    }

    public class Derived : Base
    {
        public Derived(Widget awidget) : base(awidget) { }

        new public void myEvent()
        {
            System.Console.WriteLine("The event was fired, and this text is the response!");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Widget myWidget = new Widget();
            Derived myDerived = new Derived(myWidget);

            myWidget.SetEvent();
        }
    }

}

私が欲しいのは、テキストが表示されることです。つまり、継承された基本メソッドを基本クラスのイベントにサブスクライブし、サブクラスでコンストラクターを呼び出して、そのイベントが発生したときに基本クラスの代わりに呼び出されるサブクラスのイベント メソッドを取得したいと考えています。

これを行う方法はありますか?

4

3 に答える 3

1

メソッド virtual を設定する必要があります。

public class Base
{...       

    public virtual void myEvent() { }

そしてそれを上書きする

    public class Derived : Base
{
    ...

    public override void myEvent()
    {
        System.Console.WriteLine("The event was fired, and this text is the response!");
    }
}
于 2013-07-15T16:24:26.823 に答える
0

基本クラスのメソッドを仮想としてマークすると、問題が解決されます。

 public virtual void myEvent() { }
于 2013-07-15T16:24:13.597 に答える
0
new public void myEvent()

これにより、新しいイベントが作成されます。あなたはそれを望んでいません。virtual基底クラスでイベントを作成し、ここoverrideの代わりに使用しnewます。

于 2013-07-15T16:23:30.973 に答える