0

いくつかのフォームがあり、それらには基本的に同一のイベント関数がいくつかあります

「共有」クラスを実装し、イベントハンドラーをその関数にリンクしようとしましたが、関数に必要な保護レベルを与えると、非静的であると不平を言い、静的にする必要があります。

私は静的関数のファンではないので、質問してください。それを行うより良い方法はありますか?

(上記が不明な場合: 私はこれを行いたい: .NET で複数のボタンに対して単一のイベント ハンドラーを設定しますか?ただし、複数のコントロールではなく複数のフォームを使用します)

編集:詳細情報のリクエストに従って:

私はコードの重複についてかなりOCDであり、私のプログラムには同時にアクティブ/非表示の複数のフォームがあり、「x」が押されたときにプログラム全体を閉じたいのは明らかです。

class Shared
{
    public static void FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }

    public static void FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("Are you sure you want to exit?", "Confirm exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
            e.Cancel = true;
        }
    }
}

非常に単純な関数、私は知っていますが、重複は好きではありません:P

上記の「public static」の「構成」は正常に機能しますが、「より良い方法」があるかどうか疑問に思いました (tm)

4

2 に答える 2

1

静的クラスが必要ない場合は、ほとんどの好みに合う 2 つの簡単なオプションがあります。

  • シングルトン
  • パラメータをフォーム ctor に渡す

シングルトンの場合:

class EventMangler {

   private static readonly _instance = new SomeHandler ();

   // although you don't like static methods  :(
   static EventMangler Instance {
      get { return _instance; }

   public void SomeEventHandler (object sender, EventArgs e) {
      // handle event
   }
}

// use EventMangler.Instance
public MyForm () {
   InitializeComponent();
   button1.Click += EventMangler.Instance.SomeEventHandler;
}

Form のコンストラクターにパラメーターを渡すには、(a) ハンドラーのオブジェクトへの参照を渡すか、(b) ハンドラー自体への参照を渡すかの選択肢があります。単一ハンドラーのオプション (b) を好みます。それ以外の場合、たとえば親オブジェクトEventManglerに複数のハンドラーがある場合は、オプション (a) を使用します。

// remove singleton Instance method from EventMangler
// instantiate EventMangler in Program and pass to Form ctors

// pass a single handler reference as Action
public MyForm (Action<object, EventArgs> handler) {
   InitializeComponent();
   button1.Click += handler;
}
于 2012-08-23T13:38:13.490 に答える
1

静的メソッドを使用してから、処理をインスタンスに委譲してから、OOP のすべての美しさを使用することができます

public static void GeneralHandler(object sender, EventArgs args)
{
    instance.Handle(sender, args);
}
private static MyProcessingClass instance = new MyProcessingClass();

購読する

button1.Event1 += GeneralHandler;
Button1.Event2 += GeneralHandler;
Button1.Event1 += GeneralHandler;

HandlerProvider外部にインターフェースのみを公開しながら、そこに作成メカニズムを導入してカプセル化するなど、依存性注入をサポートするように実装をさらに強化できます

于 2012-08-23T13:39:58.583 に答える