第五章:代理
代理實現的是象c++等語言的指針功能,不同於函數指針,代理是一種面向對象、安全類型的。代理事派生於公共基類(system)的一種參考類型,方法被壓入一個代理中,對於實例方法被稱為實例的組成實體或關於實例的方法,而靜態方法,被稱為類的組成實體或類方法。代理的強大功能是它可以自動的匹配方法,而不管其類型。
寫一個代理包括三個步驟:
寫代理、實例化、調用。
代理的聲明使用以下語法:
delegate void SimpleDelegate();
實例化一個代理
class Test
{
static void F() {
System.Console.WriteLine("hello world");
}
static void Main() {
SimpleDelegate d = new SimpleDelegate(F);//將方法壓入
d();//通過代理;
F();//不通過代理;
}
}
最後讓我們調用她
void MultiCall(SimpleDelegate d, int count) {
for (int i = 0; i < count; i++)
d();
}
}
我們可以看到對於方法的調用是通過代理來完成的,調用時並不需要知道被調用她的類型。代理在我看來好比是對象要一件事她不直接地調用這個方法,而是通過一個中間人去調用她。
下面就代理的強大功能進行詳細介紹:首先然我們實現一個這樣的功能,考慮一下該如何用指向基類的對象調用子類的成員函數。在這裡程序員是不是點懷戀指針了,不過在c#中這樣的功能完全也可實現的,使用一個單獨的代理我們可以完成這項功能。以下代碼來自Timothy A. Vanover文章。
namespace DelegatesCS
{
using System;
public class Wisdom //包含代理的類
{
public delegate string GiveAdvice();
public string OfferAdvice(GiveAdvice Words)
{
return Words();
}
}
public class Parent //基類
{
public virtual string Advice()
{
return("Listen to reason");
}
~Parent() {}
}
public class Dad: Parent //子類
{
public Dad() {}
public override string Advice()
{
return("Listen to your Mom");
}
~Dad() {}
}
public class Mom: Parent //子類
{
public Mom() {}
public override string Advice()
{
return("Listen to your Dad");
}
~Mom() {}
}
public class Daughter //不繼承與基類的類
{
public Daughter() {}
public string Advice()
{
return("I know all there is to life");
}
~Daughter() {}
}
public class Test
{
public static string CallAdvice(Parent p)//使用基類
{
Wisdom parents = new Wisdom();
Wisdom.GiveAdvice TeenageGirls = new Wisdom.GiveAdvice(p.Advice);//將Advice方法委托給TeenageGirls委托對象
return(parents.OfferAdvice(TeenageGirls));
}
public static void Main()
{
Dad d = new Dad();
Mom m = new Mom();
Daughter g = new Daughter();
//以下兩個為衍於基類的類
Con
[1] [2] 下一頁
sole.WriteLine(CallAdvice(d));
Console.WriteLine(CallAdvice(m));
//以下為未衍於基類的類,如果調用將出錯。
//Console.WriteLine(CallAdvice(g));
}
}
}
上一頁 [1] [2]