1.泛型建構式與解建構式
public class MyGenericList<T>
{
private ArrayList _elements;
public MyGenericList() //建構式
{
_elements = new ArrayList();
}
~MyGenericList() //解建構式
{
}
}
注意地方:
泛型的建構式與解建構式不需要加上型別參數例如MyGenericList<T>加了反而無法通過編譯。
2.Default表示法
由於型別參數T代表由外界傳入決定型別,因此若我扪在撰寫泛型類別時,要將某泛型物件之參數設定為傳入型別之初始植,就不能用特定數植。
此時應該使用default運算子來取得未知之型別預設植。
public class MyGenericList<T> : IMyList<T>
{
private ArrayList _elements;
public void GenericItems(int numOfItems)
{
T[ ] buf = new T[numOfItems];
for(int i = 0; i < numOfItems; i++)
{
buf[i] = default(T); //設定元素初始植
}
}
}
3.泛型介面
public interface IMyList<T>
{
int Count{ get; }
T this [index]
{
get;
set;
}
}
此介面定義了兩個屬性: 一個唯讀屬性count,用來傳回串列元素數量,以及一個index用來取得某元素之內容。
public class MyGenericList<T> : IMList<T>
{
private ArrayList _elements;
public int Count
{
get {return _elements.Count;}
}
public T this[int index]
{
get{ return (T) _elements[index]; }
set{ _elements[index] = value; }
}
}
泛型介面範例2:
特別注意:
1.建立Hello與Hello2之物件均傳入string,但使用GetWord方法時一個傳入字串另一個是傳入數字。
2.此種方式無法通過編譯:
class Foo<T> : ISayHello<int> , ISayHello<T>
{
}
因為一個類別不得實作重複之介面,ISayHello<T>型別參數T已經包含int了。
4.泛型方法
泛型方法宣告語法:
回傳型別 方法名稱 <T1,T2,T3...,Tn>(T1 param) [where 子句]
ex.
public void Print<T>(T obj)
public R Print<T,R>(T obj) where R : new()
此範例中宣告兩個多載泛型方法:Print<>,其中一個有回傳植一個沒有。
有回傳植的那個多載方法使用了where子句,來限制傳回植型別R必須提供預設建構式。
ex.
建立泛型方法:
呼叫不同泛型方法: