c#如何实现接口事件
接口可以声明事件。下面的示例演示如何在类中实现接口事件。这些规则基本上都与实现任何接口方法或属性时的相同。
在类中实现接口事件
在类中声明事件,然后在相应区域中调用它。
namespaceImplementInterfaceEvents
{
publicinterfaceIDrawingObject
{
eventEventHandlerShapeChanged;
}
publicclassMyEventArgs:EventArgs
{
//classmembers
}
publicclassShape:IDrawingObject
{
publiceventEventHandlerShapeChanged;
voidChangeShape()
{
//Dosomethingherebeforetheevent…
OnShapeChanged(newMyEventArgs(/*arguments*/));
//ordosomethinghereaftertheevent.
}
protectedvirtualvoidOnShapeChanged(MyEventArgse)
{
ShapeChanged?.Invoke(this,e);
}
}
}
示例
下面的示例演示如何处理不太常见的情况:类继承自两个或多个接口,且每个接口都具有相同名称的事件。在这种情况下,你必须为至少其中一个事件提供显式接口实现。为事件编写显式接口实现时,还必须编写add和remove事件访问器。通常这些访问器由编译器提供,但在这种情况下编译器不提供它们。
通过提供自己的访问器,可以指定两个事件是由类中的同一个事件表示,还是由不同事件表示。例如,如果根据接口规范应在不同时间引发事件,可以在类中将每个事件与单独实现关联。在下面的示例中,订阅服务器确定它们通过将形状引用转换为IShape或IDrawingObject接收哪个OnDraw事件。
namespaceWrapTwoInterfaceEvents
{
usingSystem;
publicinterfaceIDrawingObject
{
//Raisethiseventbeforedrawing
//theobject.
eventEventHandlerOnDraw;
}
publicinterfaceIShape
{
//Raisethiseventafterdrawing
//theshape.
eventEventHandlerOnDraw;
}
//Baseclasseventpublisherinheritstwo
//interfaces,eachwithanOnDrawevent
publicclassShape:IDrawingObject,IShape
{
//Createaneventforeachinterfaceevent
eventEventHandlerPreDrawEvent;
eventEventHandlerPostDrawEvent;
objectobjectLock=newObject();
//Explicitinterfaceimplementationrequired.
//AssociateIDrawingObject'seventwith
//PreDrawEvent
#regionIDrawingObjectOnDraw
eventEventHandlerIDrawingObject.OnDraw
{
add
{
lock(objectLock)
{
PreDrawEvent+=value;
}
}
remove
{
lock(objectLock)
{
PreDrawEvent-=value;
}
}
}
#endregion
//Explicitinterfaceimplementationrequired.
//AssociateIShape'seventwith
//PostDrawEvent
eventEventHandlerIShape.OnDraw
{
add
{
lock(objectLock)
{
PostDrawEvent+=value;
}
}
remove
{
lock(objectLock)
{
PostDrawEvent-=value;
}
}
}
//Forthesakeofsimplicitythisonemethod
//implementsbothinterfaces.
publicvoidDraw()
{
//RaiseIDrawingObject'seventbeforetheobjectisdrawn.
PreDrawEvent?.Invoke(this,EventArgs.Empty);
Console.WriteLine("Drawingashape.");
//RaiseIShape'seventaftertheobjectisdrawn.
PostDrawEvent?.Invoke(this,EventArgs.Empty);
}
}
publicclassSubscriber1
{
//ReferencestheshapeobjectasanIDrawingObject
publicSubscriber1(Shapeshape)
{
IDrawingObjectd=(IDrawingObject)shape;
d.OnDraw+=d_OnDraw;
}
voidd_OnDraw(objectsender,EventArgse)
{
Console.WriteLine("Sub1receivestheIDrawingObjectevent.");
}
}
//ReferencestheshapeobjectasanIShape
publicclassSubscriber2
{
publicSubscriber2(Shapeshape)
{
IShaped=(IShape)shape;
d.OnDraw+=d_OnDraw;
}
voidd_OnDraw(objectsender,EventArgse)
{
Console.WriteLine("Sub2receivestheIShapeevent.");
}
}
publicclassProgram
{
staticvoidMain(string[]args)
{
Shapeshape=newShape();
Subscriber1sub=newSubscriber1(shape);
Subscriber2sub2=newSubscriber2(shape);
shape.Draw();
//Keeptheconsolewindowopenindebugmode.
System.Console.WriteLine("Pressanykeytoexit.");
System.Console.ReadKey();
}
}
}
/*Output:
Sub1receivestheIDrawingObjectevent.
Drawingashape.
Sub2receivestheIShapeevent.
*/
以上就是c#如何实现接口事件的详细内容,更多关于c#实现接口事件的资料请关注毛票票其它相关文章!