泛型委托是委托的一種特殊形式,感覺看上去比較怪異,其實在使用的時候跟委托差不多,不過泛型委托更具有類型通用性。
就拿C#里最常見的委托EventHandler打比方。在.NET 2.0以前,也就是泛型出現以前,普通的事件處理函數都由EventHandler定義,如下:
- public delegate void EventHandler(object sender, EventArgs e);
EventHandler指代了這樣一類函數,這些函數沒有返回值,並且有兩個參數,第一個參數是object類型,而第二個參數是EventArgs類型。
而.NET 2.0及其以后的版本,由於泛型的引入,所以一些內建(Built-in)的類、接口、委托都有了各自的泛型版本。EventHandler也不例外,它有了自己的泛型版本:EventHandler<T>,它的定義如下:
- [Serializable]
- public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs;
您應該可以發現,第二個參數的類型由EventArgs變成了TEventArgs,而TEventArgs具體是什么,則由調用方決定。假設IntEventArgs和StringEventArgs都繼承於System.EventArgs,那么:
- EventHandler<IntEventArgs>指代這樣一類函數:這些函數沒有返回值,有兩個參數,第一個參數是object類型,第二個參數是IntEventArgs類型
- EventHandler<StringEventArgs>指代這樣一類函數:這些函數沒有返回值,有兩個參數,第一個參數是object類型,第二個參數是StringEventArgs類型
其實EventHandler<IntEventArgs>和EventHandler<StringEventArgs>是兩個完全不同的委托,它們所指代的函數都分別有着不同的簽名形式。請參見下面的示例:
- class IntEventArgs : System.EventArgs
- {
- public int IntValue { get; set; }
- public IntEventArgs() { }
- public IntEventArgs(int value)
- { this.IntValue = value; }
- }
- class StringEventArgs : System.EventArgs
- {
- public string StringValue { get; set; }
- public StringEventArgs() { }
- public StringEventArgs(string value)
- { this.StringValue = value; }
- }
- class Program
- {
- static void PrintInt(object sender, IntEventArgs e)
- {
- Console.WriteLine(e.IntValue);
- }
- static void PrintString(object sender, StringEventArgs e)
- {
- Console.WriteLine(e.StringValue);
- }
- static void Main(string[] args)
- {
- EventHandler<IntEventArgs> ihandler =
- new EventHandler<IntEventArgs>(PrintInt);
- EventHandler<StringEventArgs> shandler =
- new EventHandler<StringEventArgs>(PrintString);
- ihandler(null, new IntEventArgs(100));
- shandler(null, new StringEventArgs("Hello World"));
- }
- }
有關泛型的具體特性與其在面向對象思想中的應用,將在后續與泛型相關的文章中重點闡述。
原文地址:http://www.cnblogs.com/daxnet/archive/2008/11/11/1687012.html