C# 泛型運(yùn)算符
在C#中,可以像其他方法一樣進(jìn)行運(yùn)算符的重寫,也可以在泛型類中實(shí)現(xiàn)此類重寫。例如,可在Fami<T>中定義如下隱式的轉(zhuǎn)換運(yù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對(duì)象直接作為L(zhǎng)ist<Animal>來訪問。例如,使用下面的運(yùn)算符添加兩個(gè)Farm<T>實(shí)例,這是很方便的:
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>^實(shí)例,如下所示:
Farm<Animal> newFarm = farm + dairyFarm;
在這行代碼中,dairyFarm(Farm<Cow>的實(shí)例)隱式轉(zhuǎn)換為L(zhǎng)ist<Animal>, List<Animal>可在Fann<T>中由重載運(yùn)算符+使用。
讀者可能認(rèn)為,使用下面的代碼也可以做到這一點(diǎn):
public static Farm<T> operator +(Farm<T> farml, Farm<T> farm2){ ... }
但是,F(xiàn)arm<Cow>不能轉(zhuǎn)換為Farm<Animal>,所以匯總會(huì)失敗。為了更進(jìn)一步,可以使用下面的轉(zhuǎn)換運(yùn)算符來解決這個(gè)問題:
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;
}
使用這個(gè)運(yùn)算符,F(xiàn)arm<T>的實(shí)例(如Farm<Cow>)就可以轉(zhuǎn)換為Farm<Animal>的實(shí)例,這解決了上面的問題。所以,可以使用上面列出的兩種方法中的一種,但是后者更適合,因?yàn)樗容^簡(jiǎn)單。
點(diǎn)擊加載更多評(píng)論>>