0

我有一些表格,其中我有一些基本相同的事件函数

我试图实现一个“共享”类并将 Eventhandler 链接到该函数,但是当我为该函数提供必要的保护级别时,它抱怨它是非静态的,我也必须将其设为静态。

我不喜欢静态函数,所以问:有更好的方法吗?

(如果上述内容不清楚:我想这样做:为 .NET 中的多个按钮设置单个事件处理程序?但使用多个表单而不是多个控件)

编辑:根据要求提供更多信息:

我对代码重复非常有强迫症,我的程序同时有多个活动/隐藏表单,显然我想在按下“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

上面的“公共静态”的“配置”工作正常,但我只是想知道是否有“更好的方法”(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 回答