2016-09-19 74 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类中执行所有操作,请忽略此项。