如果你看了本BLOG写的委托的文章,理解本文应该比较容易,C#中的事件的实现是通过委托直接实现的,所以本文只给出事件实现的代码示例,如果你明白了委托,相信看懂本代码应该不难。
using
System;
namespace Events
{
delegate void SomeDelegate( string sender);
interface ISomeInterface
{
event SomeDelegate SomeEvent;
void PerformSomeEvent();
void SomeEventHandler( string sender);
}
abstract class AbstractClass:ISomeInterface
{
public virtual event SomeDelegate SomeEvent;
public abstract void SomeEventHandler( string sender);
public abstract void PerformSomeEvent();
protected void PerformSomeEventInternal( string sender)
{
if ( null != SomeEvent)
{
SomeEvent(sender);
}
}
protected void SomeEventHandlerInternal( string sender, string receiver)
{
Console.WriteLine( " some event has been handler " );
Console.WriteLine( " Sender is [ " + sender + " ] " );
Console.WriteLine( " Receiver is [ " + receiver + " ] " );
Console.WriteLine( " ------------------------------------ " );
}
}
class SomeClass:AbstractClass,ISomeInterface
{
public override void PerformSomeEvent()
{
PerformSomeEventInternal( " Some Class " );
}
public override void SomeEventHandler( string sender)
{
SomeEventHandlerInternal(sender, " Some Class " );
}
}
class AnotherClass:AbstractClass,ISomeInterface
{
public override void PerformSomeEvent()
{
PerformSomeEventInternal( " Another Class " );
}
public override void SomeEventHandler( string sender)
{
SomeEventHandlerInternal(sender, " Another Class " );
}
}
class SomeApplication
{
public static void SomeEventStaticHander( string sender)
{
Console.WriteLine( " some event has been handler. " );
Console.WriteLine( " Sender is [ " + sender + " ] " );
Console.WriteLine( " Receiver is [some application] " );
Console.WriteLine( " ------------------------------------- " );
}
static void Main( string [] args)
{
SomeClass someclass = new SomeClass();
AnotherClass anotherclass = new AnotherClass();
someclass.SomeEvent += new SomeDelegate(someclass.SomeEventHandler);
someclass.SomeEvent += new SomeDelegate(anotherclass.SomeEventHandler);
someclass.SomeEvent += new SomeDelegate(SomeApplication.SomeEventStaticHander);
someclass.PerformSomeEvent();
Console.ReadLine();
}
}
}
namespace Events
{
delegate void SomeDelegate( string sender);
interface ISomeInterface
{
event SomeDelegate SomeEvent;
void PerformSomeEvent();
void SomeEventHandler( string sender);
}
abstract class AbstractClass:ISomeInterface
{
public virtual event SomeDelegate SomeEvent;
public abstract void SomeEventHandler( string sender);
public abstract void PerformSomeEvent();
protected void PerformSomeEventInternal( string sender)
{
if ( null != SomeEvent)
{
SomeEvent(sender);
}
}
protected void SomeEventHandlerInternal( string sender, string receiver)
{
Console.WriteLine( " some event has been handler " );
Console.WriteLine( " Sender is [ " + sender + " ] " );
Console.WriteLine( " Receiver is [ " + receiver + " ] " );
Console.WriteLine( " ------------------------------------ " );
}
}
class SomeClass:AbstractClass,ISomeInterface
{
public override void PerformSomeEvent()
{
PerformSomeEventInternal( " Some Class " );
}
public override void SomeEventHandler( string sender)
{
SomeEventHandlerInternal(sender, " Some Class " );
}
}
class AnotherClass:AbstractClass,ISomeInterface
{
public override void PerformSomeEvent()
{
PerformSomeEventInternal( " Another Class " );
}
public override void SomeEventHandler( string sender)
{
SomeEventHandlerInternal(sender, " Another Class " );
}
}
class SomeApplication
{
public static void SomeEventStaticHander( string sender)
{
Console.WriteLine( " some event has been handler. " );
Console.WriteLine( " Sender is [ " + sender + " ] " );
Console.WriteLine( " Receiver is [some application] " );
Console.WriteLine( " ------------------------------------- " );
}
static void Main( string [] args)
{
SomeClass someclass = new SomeClass();
AnotherClass anotherclass = new AnotherClass();
someclass.SomeEvent += new SomeDelegate(someclass.SomeEventHandler);
someclass.SomeEvent += new SomeDelegate(anotherclass.SomeEventHandler);
someclass.SomeEvent += new SomeDelegate(SomeApplication.SomeEventStaticHander);
someclass.PerformSomeEvent();
Console.ReadLine();
}
}
}
运行的结果截图: