如何在接口C#中调用事件?

时间:2009-01-25 06:27:43

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

所以我有一个设计问题。我有一个包含委托和事件的鼠标类。即MouseButtonPressed,MouseMoved。并且这些被状态引擎调用。

我想要发生的是创建一个类似IClickable或IDraggable或somthing的接口,并在调用鼠标事件时调用这些接口内的事件。

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。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

你的意思是这样的吗?

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...
    }
}

答案 1 :(得分:0)

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

由于接口不能包含任何代码,您必须分别在所有实现类中添加OnMouseClicked方法(或其他)以在类中调用事件。你也可以在OnMouseClicked上创建一个扩展方法,但这有点颠覆了扩展方法的含义......