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

如何在接口C#中调用事件?,c#,events,delegates,state-machine,interface-design,C#,Events,Delegates,State Machine,Interface Design,所以我有一个设计问题。我有一个包含委托和事件的鼠标类。鼠标按钮按下,鼠标移动。这些都被一个状态引擎调用 我想要做的是创建一个像IClickable、IDraggable或somthing这样的接口,并在这些接口中包含在调用鼠标事件时被调用的事件 public interface IClickable public event MouseDevice.ButtonClickedHandler<MouseButtons, MouseState> Clicked; 公共接口可点击 公共

所以我有一个设计问题。我有一个包含委托和事件的鼠标类。鼠标按钮按下,鼠标移动。这些都被一个状态引擎调用

我想要做的是创建一个像IClickable、IDraggable或somthing这样的接口,并在这些接口中包含在调用鼠标事件时被调用的事件

public interface IClickable

public event MouseDevice.ButtonClickedHandler<MouseButtons, MouseState> Clicked;
公共接口可点击
公共事件MousedDevice.ButtonClickedHandler已单击;
然后在MouseDevice类中

public delegate void ButtonClickedHandler<O, S>(object sender, InputDeviceEventArgs<O, S> e);
公共委托无效按钮ClickedHandler(对象发送方,InputDeviceEventArgs e);

公共事件按钮ClickHandler按钮Click;
所以基本上我想在buttonClicked被调用时被调用


有没有办法做到这一点?

你的意思是这样的

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...
    }
}
公共类鼠标设备{
公共代表无效按钮ICKEDHANDLER(O发送方,E);
}
可点击的公共接口{
事件MousedDevice.ButtonClickedHandler已单击;
}
公共类状态机:IClickable
{
公共事件MousedDevice.ButtonClickedHandler已单击;
受保护的无效OnButtonClicked(控制发送器,MouseEventArgs e){
如果(单击!=null){
点击(发送者,e);
}
}
}
公开课考试{
公共静态void main(字符串[]args)
{
StateMachine m=新的StateMachine();
m、 单击+=新建鼠标设备。按钮单击鼠标指针(m_单击);
}
静态无效m_单击(控制发送器,鼠标指针)
{
//处理单击事件。。。
}
}

当您在接口内声明事件时,它实际上不会创建可调用的事件-然后您必须在实现接口的任何类内实现该事件


由于接口不能包含任何代码,因此必须在所有实现类中分别添加OnMouseClicked方法(或其他方法),以调用类中的事件。您还可以在接口本身上创建一个扩展方法,但这稍微颠覆了扩展方法的功能…

@Eibach-您所要做的就是在状态机中实现Iclickable接口:)您的意思是,实际将代码放在状态机类中,然后当鼠标设备被调用时,它将调用click事件?因此,如果我将接口放在鼠标设备中,那么我在里面怎么称呼它?OnButtonClicked是从哪里来的?对不起,第一篇帖子在这里,我不知道这是怎么回事。安威·伊戈尔的解决方案并没有解决问题。嗯……你能进一步解释一下吗?
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...
    }
}