【问题标题】:How to call Events in Interfaces C#?如何在接口 C# 中调用事件?
【发布时间】:2009-01-25 06:27:42
【问题描述】:

所以我有一个设计问题。我有一个具有代表和事件的鼠标类。即MouseButtonPressed、MouseMoved。并被状态引擎调用。

我想要做的是创建一个像 IClickable 或 IDraggable 或类似的接口,并在这些接口内有事件,当鼠标事件被调用时被调用。

public interface IClickable

public event MouseDevice.ButtonClickedHandler<MouseButtons, MouseState> Clicked;

然后在 MouseDevice 类中它有

public delegate void ButtonClickedHandler<O, S>(object sender, InputDeviceEventArgs<O, S> e);

public event ButtonClickedHandler<MouseButtons, MouseState> ButtonClicked;

所以基本上我希望在调用 buttonClicked 时调用 Clicked。

有没有办法做到这一点?

【问题讨论】:

  • 对不起第一次在这里发帖,没有意识到这个东西是如何工作的。 Anwayways Igor 的解决方案并没有解决问题。
  • mmmm....你能再解释一下吗?

标签: c# events delegates state-machine interface-design


【解决方案1】:

你的意思是这样的?

public class MouseDevice {
    public delegate void ButtonClickedHandler<O, E>(O sender, E e);
}

public interface IClickable<O,E> {
    event MouseDevice.ButtonClickedHandler<O,E> Clicked;
}

public class StateMachine : IClickable<Control,MouseEventArgs>
{

    public event MouseDevice.ButtonClickedHandler<Control, MouseEventArgs> Clicked;

    protected void OnButtonClicked(Control sender,MouseEventArgs e) { 
        if (Clicked != null){
            Clicked(sender, e);
        }
    }
}

public class Test {
    public static void main(string[] args)
    {
        StateMachine m = new StateMachine();
        m.Clicked += new MouseDevice.ButtonClickedHandler<Control, MouseEventArgs>(m_Clicked);
    }

    static void m_Clicked(Control sender, MouseEventArgs e)
    {
        //Handle Click Event...
    }
}

【讨论】:

  • @Eibach - 你所要做的就是在你的状态机中实现 Iclickable 接口 :)
  • 你的意思是实际上在状态机类中有代码,然后当鼠标设备被调用时让它调用点击事件?
  • 那么,如果我把接口放在鼠标设备里面,那我怎么在里面调用呢?
  • 从哪里调用 OnButtonClicked?
【解决方案2】:

当您在接口内声明一个事件时,它实际上并没有创建可以调用的事件 - 您必须在任何实现该接口的类中实现该事件。

由于接口不能包含任何代码,您必须在所有实现类中分别添加 OnMouseClicked 方法(或其他方法)以调用类中的事件。你也可以让 OnMouseClicked 成为接口本身的扩展方法,但这稍微颠覆了扩展方法的用途......

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2011-07-14
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多