class ClassWithDelegate
{
public delegate int DelegateThatReturnsInt();
public DelegateThatReturnsInt theDelegate;
public void Run()
{
for (; ; )
{
Thread.Sleep(500);
if (theDelegate != null)
{//第一個方法DisplayCounter()(由FirstSubscriber調用),返回1,2,3,4,5.但是這些值都將被第二個方法返回的值所覆蓋
//我的目的是依次顯示每個方法調用的結果。為此,必須接管多重委託所封裝方法調用的職責。
foreach (DelegateThatReturnsInt del in theDelegate.GetInvocationList())
{
int result = del();
Console.WriteLine("Delegate fired! Returned result:{0}", result.ToString());
}
Console.WriteLine();
}
}
}
}
class FirstSubscriber
{
private int myCounter = 0;
public void Subscribe(ClassWithDelegate theClassWithDelegate)
{
theClassWithDelegate.theDelegate += new ClassWithDelegate.DelegateThatReturnsInt(DisplayCounter);//委託執行個體化 //theClassWithDelegate.theDelegate +=DisplayCounter可以寫成這樣
//也可以之間用匿名過程,可以把DisplayCounter()函數去掉
// theClassWithDelegate.theDelegate +=delegate()
//{
// return ++myCounter;
// };
}
public int DisplayCounter()
{
return ++myCounter;
}
}
class SecondSubscriber
{
private int myCounter = 0;
public void Subscriber1(ClassWithDelegate theClassWithDelegate)
{
theClassWithDelegate.theDelegate += new ClassWithDelegate.DelegateThatReturnsInt(DisplayCounter1);//委託執行個體化
}
public int DisplayCounter1()
{
return myCounter += 2;
}
}
ClassWithDelegate classWithDelegate = new ClassWithDelegate();
FirstSubscriber firstSubscriber = new FirstSubscriber();
firstSubscriber.Subscribe(classWithDelegate);
SecondSubscriber secondSubscriber = new SecondSubscriber();
secondSubscriber.Subscriber1(classWithDelegate);
classWithDelegate.Run();