C# 定義泛型方法
上個示例中使用了方法GetCows()。在討論這個示例時也提到,可以使用泛型方法得到這個方法的更—般形式。在泛型方法中,返回類型和/或參數(shù)類型由泛型類型參數(shù)來確定。例如:
public T GetDefault<T>() => default(T);
這個小示例使用前面介紹的default關(guān)鍵字,為類型T返回默認值。對這個方法的調(diào)用如下所示:
int myDefaultlnt = GetDefault<int> ();
在調(diào)用該方法時提供了類型參數(shù)T。
這個T與用于給類提供泛型類型參數(shù)的類型差異極大。實際上,可以通過非泛型類來實現(xiàn)泛型方法:
public class Defaulter
{
public T GetDefault<T>() => default(T);
}
但如果類是泛型的,就必須為泛型方法類型使用不同的標識符。下面的代碼不會編譯:
public class Defaulter<T>
{
public T GetDefault<T>() => default(T);
}
必須重命名方法或類使用的類型T。
泛型方法參數(shù)可以釆用與類相同的方式使用約束,在此可以使用任意的類類型參數(shù),例如:
public class Defaulter<Tl>
{
public T2 GetDefault<T2>()
where T2 : T1
{
return default(T2);
}
}
其中,為方法提供的類型T2必須與給類提供的T1相同,或者繼承自T1。這是約束泛型方法的常用方式。在前面的Farm<T>類中,可以包含下面的方法(在Chl2Ex04的下載代碼中包含它們,但己注釋掉)。
public Farm<U> GetSpecies<U>() where U : T
{
Farm<U> speciesFarm = new Farm<U>();
foreach (T animal in animals)
{
if (animal is U)
{
speciesFarm.Animals.Add(animal as U);
}
}
return speciesFarm;
}
這可以替代GetCowsO和相同類型的其他方法。這里使用的泛型類型參數(shù)U由T約束,T又由Farm<I>類約束為Animal。因此,如果愿意,可以把T的實例視為Animal的實例。
在Chl2Ex04的客戶端代碼Program.cs中,使用這個新方法需要進行一處修改:
Farm<Cow> dairyFarm = farm.GetSpecies<Cow>();
也可以編寫如下代碼:
Farm<Chicken> poultryFarm = farm.GetSpecies<Chicken>();
對于繼承自Animal的其他類,都可以使用這種方法。
這里要注意,如果某個方法有泛型類型參數(shù),會改變該方法的簽名。也就是說,該方法有幾個重載版本,它們僅在泛型類型參數(shù)上有區(qū)別。例如:
public void ProcessT<T>(T opl){ ... }
public void ProcessT<T, U>(T opl){ ... }
使用哪個方法取決于調(diào)用方法時指定的泛型類型參數(shù)的個數(shù)。
點擊加載更多評論>>