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#实现接口事件的资料请关注毛票票其它相关文章!