c# - 在接口(interface)中使用事件

标签 c# events interface delegates

我正在实现一个使用复合设计模式的菜单系统。我有以下 MenuElement 界面:

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

我正在考虑在此接口(interface)中包含一个“OnActivate”事件,以便实现此接口(interface)的 MenuItem 可以在激活时触发功能。我试过这样实现它:

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

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

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

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

最佳答案

为什么不使用 EventHandler?例如

  // I've added "I" since it's an Interface
  public interface IMenuElement {
    void AddMenuElement(MenuElement menuToAdd);
    void RemoveMenuElement(MenuElement menuToRemove);
    void Activate();

    // I've changed your 
    // MenuElement GetMenuElement(int index)
    // to indexer
    MenuElement this[int index] {get;}

    // Event of interest; I've renamed it from onActivate
    event EventHandler Activated;
  }

  ...
  // Possible interface implementation
  public class MyMenuElement: IMenuElement {
    ...
    // name like "onActivate" is better to use here, as a private context
    private void onActivated() {
      if (Object.ReferenceEquals(null, Activated)) 
        return;

      Activated(this, EventArgs.Empty);
    }

    public void Activate() {
      // Some staff here
      ... 
      // Raising the event
      onActivated();
    }
  }

关于c# - 在接口(interface)中使用事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26134818/

相关文章:

c# - 在没有警告的情况下隐藏基类的显式接口(interface)实现的预期目的?

javascript - 如何获取附加到 AJAX 请求的事件的元信息?

Javascript - 使用代码单击图像

iOS UI 没有显示它应该在的位置

c# - 意外的转换 Xml 到数据集

java - 如何使用 BasicHttpBinding 和 BasicHttpSecurityMode.TransportWithCredential : 将 header 元素 "mustunderstand=0"设置到 SOAP 请求中

c# - MySQL 适配器填充异常

javascript - 在同一个 DOM 元素上为同一个事件添加多个函数/处理程序?

c# - 设置接口(interface)属性的默认值?

java - 是我导师的界面有问题吗?