2016-09-19 5 views
0

フォームからボタンをサブクラス化しました。これがOnClickをオーバーライドする唯一の方法だからです。別のクラスを作成せずにC#サブクラスをオーバーライドしますか?

は、しかし、今、私は私のサブボタンクラスを使用していくつかのボタンを持っていると私は彼らが(他の言葉で、私は別のものを行うために彼らの行動()メソッドをしたい)違うことをやりたいです。

悲しいことに、私はそれがその後の対処方法だ上書きする方法についての無知だし、ここでクラス宣言です:

class SubButton : Button 
    { 
     public void Action() { } 

     protected override void OnClick(EventArgs e) 
     { 
      this.Action(); 
      base.OnClick(e); 
     } 
    } 

そして、ここでは、私が試したものです:任意の助けを事前に

apply.Action = { }; 

ありがとう!

+0

OnClick()メソッドは、Clickイベントを発生させます。人生の唯一の目的は、ボタンがクリックされたときに各ボタンが専用のアクションを持つことができるようにすることです。あなたがクリックを使用していない理由は、トンネルビジョンの場合でなければなりません。 –

答えて

0

私はHimBromBeereが言ったことを拡大するために、私はあなたに代議員無効を与えました。

あなたは、コンストラクタで代理人としてあなたActionを渡すことができます。

class SubButton : Button 
    { 
     public delegate void DoAction(); 
     public DoAction Action; 

     public SubButton(DoAction action) 
     { 
      this.Action = action; 
     } 

     protected override void OnClick(EventArgs e) 
     { 
      Action?.Invoke(); // null propogation, no need for if statements. 
      base.OnClick(e); 
     } 
    } 

そして、そのようにそれを使用して:、どのようにあなたがいるEventArgs eに基づいてアクションを選択します

var btn = new SubButton(() => Console.WriteLine("Hello World!")); 
0

なぜ単純にコンストラクタインジェクションを経由してデリゲートとしてActionを渡しません:

var btn = new SubButton(() => Console.WriteLine("Hello World")); 

別のボタン何もしないこともできます:

var other = new SubButton(() => { }); 

class SubButton : Button 
{ 
    private readonly Action action; 
    public SubButton(Action action) { this.action = action; } 


    protected override void OnClick(EventArgs e) 
    { 
     if (this.action != null) this.action(); 
     base.OnClick(e); 
    } 
} 

は今、このようにそれを呼び出しますこの方法では、新しいボタンごとに新しいクラスを作成する必要はありません。単純に "コンストラクタにボタンをクリックするときに何をするかを指定します。

0

最初の方法。 eが値を送信する場合は、プロパティとして与えられた値を持つカスタムEventArgsクラスを作成する必要があります。たとえば :

public class ActionEventArgs : EventArgs 
{ 
    public ActionEventArgs(string valueName) 
    { 
     this.YourTypeValueName = valueName; 
    } 
    public YourType YourTypeValueName { get; set;} 
} 

また、あなたはそのようCustomEventHandlerを作成する必要があります。

public delegate void ActionEventHandler(object sender, ActionEventArgs args) 

その後、あなたはそうでActionDoSth1()、ActionDoSth2などの各アクションの異なるメソッドを作成し、することができます。

protected override void OnClick(ActionEventArgs e) 
{ 
    switch(e.YourTypeValueName) 
    { 
     case sth1: 
     { 
      ActionDoSth1(); 
     } 

     break; 
     case sth1: 
     { 
      ActionDoSth2(); 
     } 

     break; 
     ... 
     ... 
    } 

    base.OnClick(e); 
} 

第二の方法は、仮想アクションを行うことで、各アクションのためにあなたがアクションを上書きするサブボタンの子クラスを作成します。ActionEventArgsの代わりにEventArgsと を受け入れるためにあなたのクリック時に変更 あなたは、たとえば、クリック時の内側にスイッチを使用することができます好きなように。 この場合、ケースごとに異なるボタンがあり、ActionEventArgsを作成する必要はありません。 1つのSubButtonクラスにすべてのアクションを追加する場合は、これを無視します。

関連する問題