实现接口事件,在接口中实现事件
2016-03-09 19:59
351 查看
在类中实现接口事件
可以在接口中声明事件,然后在类中实现该事件的引用。在为方法订阅事件时,可以订阅接口声明的事件,也可以订阅类中的事件。
输出如下:
事件访问器
事件访问器类似属性访问器,事件访问器被命名为add和remove,一般情况下不需提供自定义事件访问器,因为在编译时会自动添加事件访问器。
add事件访问器:当客户端订阅该事件,调用该访问器。
remove事件访问器:当客户端取消订阅事件,调用该访问器。
类继承同名事件声明的多个接口
当类继承多个接口,接口中有同名事件声明,则需要借助add和remove事件访问器显示接口实现。
输出如下:
分类:
可以在接口中声明事件,然后在类中实现该事件的引用。在为方法订阅事件时,可以订阅接口声明的事件,也可以订阅类中的事件。
class InterfaceEvent { static void Main(string[] args) { Shape s = new Shape(); IDrawingObject ido = s; //为HandlerShapeChanged方法订阅接口中声明的事件 ido.ShapeChanged += HandlerShapeChanged; //为HandlerShapeChanged方法订阅实现接口的事件 s.ShapeChanged += HandlerShapeChanged; s.ChangeShape(); Console.Read(); } static void HandlerShapeChanged(object sender, CustomEventArgs e) { Console.WriteLine("Received event.Shape area is now {0}", e.Area); } } public class CustomEventArgs : EventArgs { private double area; public double Area { get { return area; } set { area = value; } } public CustomEventArgs(double a) { area = a; } } public interface IDrawingObject { event EventHandler<CustomEventArgs> ShapeChanged; } public class Shape : IDrawingObject { public event EventHandler<CustomEventArgs> ShapeChanged; public void ChangeShape() { OnShapeChanged(new CustomEventArgs(10)); } protected virtual void OnShapeChanged(CustomEventArgs e) { EventHandler<CustomEventArgs> hander = ShapeChanged; if (hander != null) { hander(this, e); } } }
输出如下:
事件访问器
事件访问器类似属性访问器,事件访问器被命名为add和remove,一般情况下不需提供自定义事件访问器,因为在编译时会自动添加事件访问器。
add事件访问器:当客户端订阅该事件,调用该访问器。
remove事件访问器:当客户端取消订阅事件,调用该访问器。
class Events : IDrawingObject { event EventHandler PreDrawEvent; event EventHandler IDrawingObject.OnDraw { add { lock (PreDrawEvent) { PreDrawEvent += value; } } remove { lock (PreDrawEvent) { PreDrawEvent -= value; } } } }
类继承同名事件声明的多个接口
当类继承多个接口,接口中有同名事件声明,则需要借助add和remove事件访问器显示接口实现。
class TwoInterfaceEvent { static void Main(string[] args) { Shape shape = new Shape(); Subscriber1 sub1 = new Subscriber1(shape); Subscriber2 sub2 = new Subscriber2(shape); shape.Draw(); Console.Read(); } } public interface IDrawingObject { event EventHandler OnDraw; } public interface IShape { event EventHandler OnDraw; } public class Shape : IDrawingObject, IShape { event EventHandler PreDrawEvent; event EventHandler PostDrawEvent; object objectLock = new object(); /// <summary> /// 明确接口实现 /// PreDrawEvent与IDrawingObject.OnDraw关联 /// </summary> event EventHandler IDrawingObject.OnDraw { add { lock (objectLock) { PreDrawEvent += value; } } remove { lock (objectLock) { PreDrawEvent -= value; } } } /// <summary> /// 明确接口实现 /// PostDrawEvent与IShape.OnDraw关联 /// </summary> event EventHandler IShape.OnDraw { add { lock (objectLock) { PostDrawEvent += value; } } remove { lock (objectLock) { PostDrawEvent -= value; } } } /// <summary> /// 同时引用两个接口事件 /// </summary> public void Draw() { //引用事件PreDrawEvent EventHandler handler = PreDrawEvent; if (handler != null) { handler(this, new EventArgs()); } Console.WriteLine("Raised IDrawingObject's event."); //引用事件PostDrawEvent handler = PostDrawEvent; if (handler != null) { handler(this, new EventArgs()); } Console.WriteLine("Raised IShape's event."); } } public class Subscriber1 { 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."); } } public class Subscriber2 { public Subscriber2(Shape shape) { IShape s = (IShape)shape; s.OnDraw+=new EventHandler(s_OnDraw); } void s_OnDraw(object sender, EventArgs e) { Console.WriteLine("Sub2 receives the IShape event."); } }
输出如下:
分类:
相关文章推荐
- 田渊栋:AlphaGo系统即使在单机上也有职业水平
- 阿里巴巴 一面
- WebView——重写WebView实现在WebView内部加载网页
- 浮点型数据存储方式
- 笔试面试搜集资料汇总
- android自学第三天
- struts动态方法调用之感叹号
- Spring整合CXF,发布RSETful 风格WebService
- hdu 5365
- Integer.highestOneBit(int i)的作用
- Java与C/C++的比较(转)
- HDU 3085 Nightmare Ⅱ 双向BFS
- 按照反向斜对角线(右上->左下)的方式打印M行N列的数组arrMatrix[M][N]
- MRC到ARC的自动转换
- 不用迭代器的容器表示
- win7出现无法连接到代理服务器的错误,不能上网的问题的解决
- The Worm Turns
- iOS黑魔法-Method Swizzling
- 作业1
- winform textBox输入提示