c#如何实现接口事件

 更新时间:2020年10月13日 10:40:16   作者:olprod  
这篇文章主要介绍了c#如何实现接口事件,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下

接口可以声明事件。 下面的示例演示如何在类中实现接口事件。 这些规则基本上都与实现任何接口方法或属性时的相同。

在类中实现接口事件

在类中声明事件,然后在相应区域中调用它。

namespace ImplementInterfaceEvents 
{ 
 public interface IDrawingObject 
 { 
  event EventHandler ShapeChanged; 
 } 
 public class MyEventArgs : EventArgs
 { 
  // class members 
 } 
 public class Shape : IDrawingObject 
 { 
  public event EventHandler ShapeChanged; 
  void ChangeShape() 
  { 
   // Do something here before the event… 

   OnShapeChanged(new MyEventArgs(/*arguments*/)); 

   // or do something here after the event.
  } 
  protected virtual void OnShapeChanged(MyEventArgs e) 
  { 
   ShapeChanged?.Invoke(this, e); 
  } 
 } 

}

示例

下面的示例演示如何处理不太常见的情况:类继承自两个或多个接口,且每个接口都具有相同名称的事件。 在这种情况下,你必须为至少其中一个事件提供显式接口实现。 为事件编写显式接口实现时,还必须编写 addremove 事件访问器。 通常这些访问器由编译器提供,但在这种情况下编译器不提供它们。

通过提供自己的访问器,可以指定两个事件是由类中的同一个事件表示,还是由不同事件表示。 例如,如果根据接口规范应在不同时间引发事件,可以在类中将每个事件与单独实现关联。 在下面的示例中,订阅服务器确定它们通过将形状引用转换为 IShape IDrawingObject 接收哪个 OnDraw 事件。

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
  #region IDrawingObjectOnDraw
  event EventHandler IDrawingObject.OnDraw
  {
   add
   {
    lock (objectLock)
    {
     PreDrawEvent += value;
    }
   }
   remove
   {
    lock (objectLock)
    {
     PreDrawEvent -= value;
    }
   }
  }
  #endregion
  // 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.
   PreDrawEvent?.Invoke(this, EventArgs.Empty);

   Console.WriteLine("Drawing a shape.");

   // Raise IShape's event after the object is drawn.
   PostDrawEvent?.Invoke(this, EventArgs.Empty);
  }
 }
 public class Subscriber1
 {
  // References the shape object as an IDrawingObject
  public Subscriber1(Shape shape)
  {
   IDrawingObject d = (IDrawingObject)shape;
   d.OnDraw += 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 += 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();
  }
 }
}
/* Output:
 Sub1 receives the IDrawingObject event.
 Drawing a shape.
 Sub2 receives the IShape event.
*/

以上就是c#如何实现接口事件的详细内容,更多关于c# 实现接口事件的资料请关注脚本之家其它相关文章!

相关文章

  • C#生成Word文件(图片、文字)

    C#生成Word文件(图片、文字)

    这篇文章主要为大家详细介绍了C#生成Word文件,包括图片、文字等素材,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • c#的时间日期操作示例分享(c#获取当前日期)

    c#的时间日期操作示例分享(c#获取当前日期)

    这篇文章主要介绍了c#的时间日期操作示例,在给定时间戳返回指定的时间格式和获取当前时间方法,需要的朋友可以参考下
    2014-03-03
  • C#扩展方法实例分析

    C#扩展方法实例分析

    这篇文章主要介绍了C#扩展方法,结合实例形式分析了C#扩展方法的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-06-06
  • C#实现格式化SQL语句的示例代码

    C#实现格式化SQL语句的示例代码

    这篇文章主要为大家详细介绍了C#如何实现格式化SQL语句的功能,文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • 详细介绍C#之文件校验工具的开发及问题

    详细介绍C#之文件校验工具的开发及问题

    目前校验文件使用最多的是MD值和SHA值,不外乎有些使用CRC,前段时间微软发布了VisualStudio正式版,win镜像,微软官方给出的校验方式都是校验文件的SHA值。下面详细介绍C#之文件校验工具的开发及问题,需要的朋友可以参考下
    2015-07-07
  • C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法

    C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法

    这篇文章主要介绍了C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法,结合实例形式分析了GetDesktopWindow函数用于获取窗口句柄的具体使用方法与相关注意事项,需要的朋友可以参考下
    2016-08-08
  • 轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类,对C#的ArrayList类感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的ArrayList类
    2015-11-11
  • c#基于Redis实现轻量级消息组件的步骤

    c#基于Redis实现轻量级消息组件的步骤

    这篇文章主要介绍了c#基于Redis实现轻量级消息组件的步骤,帮助大家更好的理解和学习使用c#进行开发,感兴趣的朋友可以了解下
    2021-05-05
  • C#如何快速释放内存的大数组详解

    C#如何快速释放内存的大数组详解

    这篇文章主要给大家介绍了关于C#如何快速释放内存的大数组的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C#查找对象在ArrayList中出现位置的方法

    C#查找对象在ArrayList中出现位置的方法

    这篇文章主要介绍了C#查找对象在ArrayList中出现位置的方法,涉及C#中IndexOf方法的使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论