C#接口事件的实现解析

C#接口事件的实现是如何办到的呢?C#接口事件的实现具体的步骤和需要注意的事项,那么本文就向你介绍具
首页 新闻资讯 行业资讯 C#接口事件的实现解析

C#接口事件的实现是如何的呢?下面的C#接口事件示例演示如何在类中实现接口事件。实现C#接口事件的规则与实现任何接口方法或属性的规则基本相同。

C#接口事件实例:

在类中实现接口事件,在类中声明事件,然后在适当的区域调用该事件。

复制

public interface IDrawingObject  {  event EventHandler ShapeChanged;  }  public class MyEventArgs : EventArgs {…}  public class Shape : IDrawingObject  {  event EventHandler ShapeChanged;  void ChangeShape()  {  // Do something before the event…  OnShapeChanged(new MyEventsArgs(…));  // or do something after the event.   }  protected virtual void OnShapeChanged(MyEventArgs e)  {  if(ShapeChanged != null)  {     ShapeChanged(this, e);  }  }  }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

C#接口事件示例

下面的示例演示如何处理以下的不常见情况:您的类是从两个以上的接口继承的,每个接口都含有同名事件)。在这种情况下,您至少要为其中一个事件提供显式接口实现。为事件编写显式接口实现时,必须编写 add 和 remove 事件访问器。这两个事件访问器通常由编译器提供,但在这种情况下编译器不能提供。

您可以提供自己的访问器,以便指定这两个事件是由您的类中的同一事件表示,还是由不同事件表示。例如,根据接口规范,如果事件应在不同时间引发,则可以将每个事件与类中的一个单独实现关联。在下面的示例中,订户将形状引用强制转换为 IShape 或 IDrawingObject,从而确定自己将会接收哪个 OnDraw 事件。

C#接口事件代码:

复制

namespace WrapTwoInterfaceEvents  {  using System;   public interface IDrawingObject  {  // Raise this event before drawing  // the object.  event EventHandler OnDraw;  }  public interface IShape  {  // Raise this event after drawing  // the shape.  event EventHandler OnDraw;  }    // Base class event publisher inherits two  // interfaces, each with an OnDraw event  public class Shape : IDrawingObject, IShape  {  // Create an event for each interface event  event EventHandler PreDrawEvent;  event EventHandler PostDrawEvent;   object objectLock = new Object();   // Explicit interface implementation required.  // Associate IDrawingObject's event with  // PreDrawEvent  event EventHandler IDrawingObject.OnDraw  {  add  {  lock (objectLock)  {  PreDrawEvent += value;  }  }  remove  {  lock (objectLock)  {  PreDrawEvent -= value;  }  }  }  // Explicit interface implementation required.  // Associate IShape's event with  // PostDrawEvent  event EventHandler IShape.OnDraw  {  add   {  lock (objectLock)  {  PostDrawEvent += value;  }  }  remove  {  lock (objectLock)  {  PostDrawEvent -= value;  }  }    }   // For the sake of simplicity this one method  // implements both interfaces.   public void Draw()  {  // Raise IDrawingObject's event before the object is drawn.  EventHandler handler = PreDrawEvent;  if (handler != null)  {  handler(this, new EventArgs());  }  Console.WriteLine("Drawing a shape.");   // RaiseIShape's event after the object is drawn.  handler = PostDrawEvent;  if (handler != null)  {  handler(this, new EventArgs());  }  }  }  public class Subscriber1  {  // References the shape object as an IDrawingObject  public Subscriber1(Shape shape)  {  IDrawingObject d = (IDrawingObject)shape;  d.OnDraw += new EventHandler(d_OnDraw);  }   void d_OnDraw(object sender, EventArgs e)  {  Console.WriteLine("Sub1 receives the IDrawingObject event.");  }  }  // References the shape object as an IShape  public class Subscriber2  {  public Subscriber2(Shape shape)  {  IShape d = (IShape)shape;  d.OnDraw += new EventHandler(d_OnDraw);  }   void d_OnDraw(object sender, EventArgs e)  {  Console.WriteLine("Sub2 receives the IShape event.");  }  }    public class Program  {  static void Main(string[] args)  {  Shape shape = new Shape();  Subscriber1 sub = new Subscriber1(shape);  Subscriber2 sub2 = new Subscriber2(shape);  shape.Draw();   // Keep the console window open in debug mode.  System.Console.WriteLine("Press any key to exit.");  System.Console.ReadKey();  }  }   }
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

  • 8.

  • 9.

  • 10.

  • 11.

  • 12.

  • 13.

  • 14.

  • 15.

  • 16.

  • 17.

  • 18.

  • 19.

  • 20.

  • 21.

  • 22.

  • 23.

  • 24.

  • 25.

  • 26.

  • 27.

  • 28.

  • 29.

  • 30.

  • 31.

  • 32.

  • 33.

  • 34.

  • 35.

  • 36.

  • 37.

  • 38.

  • 39.

  • 40.

  • 41.

  • 42.

  • 43.

  • 44.

  • 45.

  • 46.

  • 47.

  • 48.

  • 49.

  • 50.

  • 51.

  • 52.

  • 53.

  • 54.

  • 55.

  • 56.

  • 57.

  • 58.

  • 59.

  • 60.

  • 61.

  • 62.

  • 63.

  • 64.

  • 65.

  • 66.

  • 67.

  • 68.

  • 69.

  • 70.

  • 71.

  • 72.

  • 73.

  • 74.

  • 75.

  • 76.

  • 77.

  • 78.

  • 79.

  • 80.

  • 81.

  • 82.

  • 83.

  • 84.

  • 85.

  • 86.

  • 87.

  • 88.

  • 89.

  • 90.

  • 91.

  • 92.

  • 93.

  • 94.

  • 95.

  • 96.

  • 97.

  • 98.

  • 99.

  • 100.

  • 101.

  • 102.

  • 103.

  • 104.

  • 105.

  • 106.

  • 107.

  • 108.

  • 109.

  • 110.

  • 111.

  • 112.

  • 113.

  • 114.

  • 115.

  • 116.

  • 117.

  • 118.

  • 119.

  • 120.

  • 121.

  • 122.

  • 123.

  • 124.

  • 125.

  • 126.

  • 127.

  • 128.

  • 129.

  • 130.

  • 131.

  • 132.

  • 133.

  • 134.

  • 135.

  • 136.

  • 137.

复制

/* C#接口事件示例Output:  Sub1 receives the IDrawingObject event.  Drawing a shape.  Sub2 receives the IShape event.  */
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

C#接口事件的实现以及使用的一些内容就向你介绍到这里,希望对你了解和学习C#接口事件有所帮助。

【编辑推荐】

  1. C#接口的定义详解

  2. C#接口编程之接口成员浅析

  3. C#实现接口的实例解析

  4. C#接口的作用实例解析

  5. C#接口实例应用的的深入探讨

15    2009-08-31 18:01:41    C#接口事件