3

複数の子クラスを持つ親抽象クラスがあります。最終的には、子クラスの進行状況を GUI の進行状況バーに表示したいと考えています。

私が現在行っていることは、機能しないことに気付いていますが、各子クラスが上書きする仮想メソッドとして親クラスで宣言されたイベントメソッド定義です。次のようなもの:

public abstract class Parent
{
 public event EventHandler someEvent;

 protected virtual void OnSomeEvent(object sender, EventArgs e)
    {
          EventHandler eh= someEvent;
        if (eh!= null)
        {
            eh(this, e);
        }
    }
}

そして、私の子クラスには次のようなものがあります:

  protected override void OnSomeEvent(object sender, EventArgs e)
    {
        base.OnSomeEvent(sender, e);
    }

イベントは子クラスのどこかで発生します。

ただし、親クラスが抽象であるため、抽象クラスのインスタンスを作成できないため、GUI からイベントをリッスンできません。

私は完全にコースから外れていますか、および/またはこれを行う別の方法はありますか?

4

2 に答える 2

3

子インスタンスからイベントにアタッチできます。

public abstract class Parent
{
      public event Action Something;

      public void OnSomething()
      {
          if (Something != null)
          {
              Something();
          }
      }
}
public class Child : Parent
{

}

Child c = new Child();
c.Something += () => Console.WriteLine("Got event from child");
c.OnSomething();
> Got event from child

Parent子を含む型として宣言することもできます。

Parent c2 = new Child();
c2.Something += () => Console.WriteLine("Got event from Parent type");
c2.OnSomething();
> Got event from Parent type

抽象クラスは、それを継承するすべてのクラスにコピーされる単なるコード テンプレートです (簡単に言えば)。すべてのChildクラスに、 に存在するコードの同一のコピーが含まれていると考えてくださいParent


これにより、 の各インスタンスに対して一意のイベント ハンドラも生成されることに注意してくださいChildChildから派生するすべての の静的イベント ハンドラーを持つと、次のParentようになります。コードは必要ありませんChild

public abstract class Parent
{
    public static event Action Something;

    public static void OnSomething()
    {
        if (Something != null)
        {
            Something();
        }
    }
}

次に、たとえば次のようなことができます。

Parent.Something += () => Console.WriteLine("This will be invoked twice.");

Child c = new Child();
Child c2 = new Child();
c.OnSomething();
c2.OnSomething();

> This will be invoked twice.
> This will be invoked twice.

これらのオブジェクト/イベント呼び出しは両方とも、別々の子からのものであっても、同じイベント ハンドラーを呼び出します。

于 2013-06-03T16:52:12.677 に答える
0

someEventは指定しないためstatic、子クラスのすべてのインスタンスには独自の がありsomeEventます。これは、統一されたビューではなく、多様なビューを取得していることを意味します。これは、ボタンが押されたときに応答するのに便利です。背景をクリックしたときに同じように応答したくないからです。

通常、クラス階層を使用するのではなく、構成を使用してこの種の状況を処理します。たとえば、次のクラスを自分のクラスに追加します。

public class ParentContainer
{
    private List<Parent> watched = new List<Parent>();
    public void Add(Parent watch)
    {
        watched.Add(watch);
        watch.SomeEvent += Handler;
    }

    private void Handler(object sender, EventArgs args)
    {
        //Do something
    }
}
于 2013-06-03T16:55:19.233 に答える