C# 泛型運算符
在C#中,可以像其他方法一樣進(jìn)行運算符的重寫,也可以在泛型類中實現(xiàn)此類重寫。例如,可在Fami<T>中定義如下隱式的轉(zhuǎn)換運算符:
public static implicit operator List<Animal>(Farm<T> farm)
{
List<Animal> result = new List<Animal>();
foreach (T animal in farm)
{
result,Add(animal);
}
return result;
}
這樣,如有必要,就可以在Farm<T>中把Animal對象直接作為List<Animal>來訪問。例如,使用下面的運算符添加兩個Farm<T>實例,這是很方便的:
public static Farm<T> operator +(Farm<T> farml, List<T> farm2)
{
Farm<T> result = new Farm<T>();
foreach (T animal in farml)
{
result.Animals.Add(animal);
}
foreach (T animal in farm2)
{
if {!result.Animals.Contains(animal))
{
result.Animals.Add(animal);
}
}
return result;
}
public static Farm<T> operator + (List<T> farml, Farm<T> farm2) => farm2 + farml;
接著可以添加Farm<Animal>和Farm<Cow>^實例,如下所示:
Farm<Animal> newFarm = farm + dairyFarm;
在這行代碼中,dairyFarm(Farm<Cow>的實例)隱式轉(zhuǎn)換為List<Animal>, List<Animal>可在Fann<T>中由重載運算符+使用。
讀者可能認(rèn)為,使用下面的代碼也可以做到這一點:
public static Farm<T> operator +(Farm<T> farml, Farm<T> farm2){ ... }
但是,F(xiàn)arm<Cow>不能轉(zhuǎn)換為Farm<Animal>,所以匯總會失敗。為了更進(jìn)一步,可以使用下面的轉(zhuǎn)換運算符來解決這個問題:
public static implicit operator Farm<Animal>(Farm<T> farm)
{
Farm <Animal> result = new Farm <Animal>();
foreach (T animal in farm)
{
result.Animals.Add(animal);
}
return result;
}
使用這個運算符,F(xiàn)arm<T>的實例(如Farm<Cow>)就可以轉(zhuǎn)換為Farm<Animal>的實例,這解決了上面的問題。所以,可以使用上面列出的兩種方法中的一種,但是后者更適合,因為它比較簡單。
點擊加載更多評論>>