c#裡的運算子多載是個不常出現的應用,同時也是個好玩的東西。
我們可以使用他來實現這樣的需求:
當一個訂單與另外一個訂單相加形成一個新的訂單。新訂單的貨物為兩個訂單的貨物的並集,總價為兩個訂單的總價和。
下面實現看看
先做個輔助的貨物類public class Merchandise
{
public int Count { get; set; }
public string Name { get; set; }
public double UnitPrice { get; set; }
}然後來實現訂單類public class Order
{
public double TotalPrices { get; set; }
public List<Merchandise> Merchadises { get; set; }
public static Order operator +(Order a, Order b)
{
Order newOrder = new Order()
{
TotalPrices = a.TotalPrices + b.TotalPrices
};
newOrder.Merchadises.AddRange(a.Merchadises);
newOrder.Merchadises.AddRange(b.Merchadises);
return newOrder;
}
}下面是用戶端調用代碼
Order o1 = new Order { TotalPrices = 500.0 };
o1.Merchadises.AddRange(
new List<Merchandise>
{
new Merchandise{Name = "肥皂",Count=100,UnitPrice=3},
new Merchandise{Name = "毛巾",Count=100,UnitPrice=2}
}
);
Order o2 = new Order { TotalPrices = 8000.0 };
o1.Merchadises.AddRange(
new List<Merchandise>
{
new Merchandise{Name = "電視",Count=5,UnitPrice=1000},
new Merchandise{Name = "DVD",Count=5,UnitPrice=600}
}
);
Order o3 = o1 + o2;
可以看出,運算子多載看起來與標準靜態方法聲明類似,但它們使用關鍵字operator 和 運算子本身,而不是一個方法名。現在可以成功地使用 + 運算子和這個類。
注意:
1.要重載運算子,可給類添加運算子類型成員(它們必須是static)。
2.一些運算子有多種用途,(如 - 運算子就有一元和二元兩種功能),因此我們還指定了要處理多少個運算元,以及這些運算元的類型。
3.一般情況下,運算元的類型與定義運算子的類相同,但也可以處理混合 類型的運算子。
貼上MSDN的說明
operator 關鍵字用於在類或結構聲明中聲明運算子。運算子聲明可以採用下列四種形式之一:
|
public static result-type operator unary-operator ( op-type operand ) public static result-type operator binary-operator ( op-type operand, op-type2 operand2 ) public static implicit operator conv-type-out ( conv-type-in operand ) public static explicit operator conv-type-out ( conv-type-in operand ) |
參數
-
result-type
-
運算子的結果類型。
-
unary-operator
-
下列運算子之一:+ - ! ~ ++ — true false
-
op-type
-
第一個(或唯一一個)參數的類型。
-
operand
-
第一個(或唯一一個)參數的名稱。
-
binary-operator
-
其中一個:+ - * / % & | ^ << >> == != > < >= <=
-
op-type2
-
第二個參數的類型。
-
operand2
-
第二個參數的名稱。
-
conv-type-out
-
類型轉換運算子的目標類型。
-
conv-type-in
-
類型轉換運算子的輸入類型。
備忘
前兩種形式聲明了使用者定義的重載內建運算子的運算子。注意,並非所有內建運算子都可以被重載(請參見可重載的運算子)。op-type 和 op-type2 中至少有一個必須是封閉類型(即運算子所屬的類型)。例如,這將防止重定義整數加法運算子。
後兩種形式聲明了轉換運算子。conv-type-in 和 conv-type-out 中正好有一個必須是封閉類型(即,轉換運算子只能從它的封閉類型轉換為其他某個類型,或從其他某個類型轉換為它的封閉類型)。
運算子只能採用值參數,不能採用 ref 或 out 參數。
任何運算子聲明的前面都可以有一個可選的屬性(C# 編程指南)列表。