進哥的布拉格

Chin Gooole's Blog

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
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;

        
// Explicit interface implementation required.
        
// Associate IDrawingObject's event with
        
// PreDrawEvent
        event EventHandler IDrawingObject.OnDraw
        {
            add
            {
                
if (PreDrawEvent != null)
                {
                    
lock (PreDrawEvent)
                    {
                        PreDrawEvent 
+= value;
                    }
                }
                
else
                {
                    PreDrawEvent 
= value;
                }
            }

            remove
            {

                
if (PreDrawEvent != null)
                {
                    
lock (PreDrawEvent)
                    {
                        PreDrawEvent 
-= value;
                    }
                }
            }
        }
        
// Explicit interface implementation required.
        
// Associate IShape's event with
        
// PostDrawEvent
        event EventHandler IShape.OnDraw
        {
            add
            {
                
if (PostDrawEvent != null)
                    
lock (PostDrawEvent)
                    {
                        PostDrawEvent 
+= value;
                    }
                
else
                    PostDrawEvent 
= value;
            }
            remove
            {
                
if (PostDrawEvent != null)
                    
lock (PostDrawEvent)
                    {
                        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(
thisnew EventArgs());
            }
            Console.WriteLine(
"Drawing a shape.");

            
// RaiseIShape's event after the object is drawn.
            handler = PostDrawEvent;
            
if (handler != null)
            {
                handler(
thisnew 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();

            Console.WriteLine(
"Press Enter to close this window.");
            Console.ReadLine();
        }
    }

}
posted on 2009-09-29 14:39  進哥  阅读(254)  评论(0编辑  收藏  举报