2014-10-01 41 views
4

我正在实现一个使用复合设计模式的菜单系统。我有以下MenuElement接口:在接口中使用事件

public interface MenuElement 
{ 
    void AddMenuElement(MenuElement menuToAdd); 
    void RemoveMenuElement(MenuElement menuToRemove); 
    MenuElement GetMenuElement(int index); 
    void Activate(); 
} 

我就在想,包括此接口的“OnActivate”事件,以便实现这个接口的MenuItems激活时能够触发功能。我尝试像这样实现它:

public interface MenuElement 
{ 
    public delegate void MenuEvent(); 
    event MenuEvent onActivate; 

    void AddMenuElement(MenuElement menuToAdd); 
    void RemoveMenuElement(MenuElement menuToRemove); 
    MenuElement GetMenuElement(int index); 
    void Activate(); 
} 

但是,编译器不会让我在接口中声明委托。我知道一个名为EventHandler的C#事件类型,但与我所需的MenuEvent不同,它需要对象和EventArgs参数。我也考虑过将我的事件和委托移交给MenuItem,但我仍然好奇是否可以让界面包含一个自定义事件。

这可能吗?或者我会在这种情况下使用C#的EventHandler类吗?

+0

我编辑了您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-10-01 05:46:22

+2

1.没有理由在界面中声明委托类型。 2.为什么*不会*你想要标准的'EventHandler'签名?它存在一个很好的理由,然后你只是有'公共事件EventHandler 激活;' – 2014-10-01 05:47:59

+0

我不想使用EventHandler的原因是因为我在考虑使用没有任何参数的函数来处理事件。你在处理无参数事件处理函数的情况下做什么? – TheYokai 2014-10-01 06:01:58

回答

3

为什么不使用EventHandler?例如。

​​
+0

我不清楚EventArgs如何与无参数事件处理函数一起使用。这个答案解释了很多,谢谢。 – TheYokai 2014-10-01 06:07:13

1

接口并不意味着实现一个字段;它是在那里来定义契约(签名),就是这样。

如果你想提供一个基本字段,结合一个“接口”,考虑一个抽象类。抽象类对提供部分实现很有用。

public abstract class MenuElement 
{ 
    public delegate void MenuEvent(); 
    event MenuEvent onActivate; 

    abstract virtual void AddMenuElement(MenuElement menuToAdd); 
    abstract virtual void Activate(); 
} 

如果重要的是也有一个接口,那么只需要您的一个MenuElement类继承的接口,并把它传递给它的后代。抽象类可以在不实现它们的情况下继承接口,以便将它们传递给叶类,从而保持便利因子。

请记住,您也可以在接口中声明一个属性,但叶类仍然需要实现该属性。