2016-09-19 65 views
0

我從表單子類化了Button,因爲這是我可以重寫OnClick的唯一方法。覆蓋C#子類而不必創建另一個類?

但現在我有幾個按鈕使用我的SubButton類,我希望他們做不同的事情(換句話說,我想他們的Action()方法做不同的東西)。

可悲的是,我如何覆蓋它的事後行動方法毫無章法,這裏的類聲明:

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

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

這裏是我的嘗試:

apply.Action = { }; 

在此先感謝您的幫助!

+0

OnClick()方法引發Click事件。誰的唯一目的就是讓每個按鈕在點擊按鈕時都有自己的專用動作。爲什麼你不使用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); 
     } 
    } 

,然後使用它像這樣:

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

爲什麼不能簡單地通過構造注射通過Action爲代表:

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); 
    } 
} 

現在這樣稱呼它:

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

另一個按鈕無能爲力:

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

這樣您就不需要爲每個新按鈕創建一個新類,只需將「點擊按鈕時要做什麼「 - 進入構造函數。

0

第一種方式,你如何選擇基於EventArgs的你的行動。如果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每個動作不同的方法,等等。 更改您的OnClick爲接受ActionEventArgs而不是EventArgs的和 然後就可以使用交換機內部的OnClick,例如:

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

     break; 
     case sth1: 
     { 
      ActionDoSth2(); 
     } 

     break; 
     ... 
     ... 
    } 

    base.OnClick(e); 
} 

第二種方法是使動作的虛擬和每個操作創建子類SubButton的,你重寫行動隨你便。 在這種情況下,您將針對每種情況設置不同的按鈕,並且不需要創建ActionEventArgs。如果您想要在一個SubButton類中執行所有操作,請忽略此項。