我正在实现一个使用复合设计模式的菜单系统。我有以下 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/