我正在实施一个使用复合设计模式的菜单系统。我有以下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不同,它需要object和EventArgs参数。我也考虑过移动我的事件并委托给MenuItem,但我仍然很好奇是否可以让界面包含自定义事件。
这可能吗?或者在这种情况下我是否必须使用C#的EventHandler类?
答案 0 :(得分:6)
为什么不使用EventHandler
? E.g。
// 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();
}
}
答案 1 :(得分:1)
接口不是为了实现一个字段;它是定义合同(签名),这就是全部。
如果要提供基本字段并结合“接口”,请考虑使用抽象类。抽象类对于提供部分实现很有用。
public abstract class MenuElement
{
public delegate void MenuEvent();
event MenuEvent onActivate;
abstract virtual void AddMenuElement( MenuElement menuToAdd );
abstract virtual void Activate();
}
如果同时拥有一个接口很重要,那么只需让您的MenuElement类继承该接口,并将其传递给它的后代。抽象类可以继承接口而不实现它们,以便将它们传递给叶类,从而保持方便因素。
请记住,您也可以在接口中声明属性,但叶子类仍然必须实现该属性。