使用時機
定義一個 BankAccount class,描述這銀行帳戶的擁有者及其金額
class BankAccount
{
private string _owner;
private double _money;
public BankAccount(string owner, double money)
{
_owner = owner;
_money = money;
}
}
接著在clint產生兩個實體:
BankAccount account1 = new BankAccount("Iverson Hong", 1000);
BankAccount account2 = new BankAccount("Michael Jordan", 2000);
接下來我想要些後續操作:
-
我想要比較兩個戶頭裡的錢誰比較多。
-
我想要把兩個戶頭的錢存在一個共同戶頭裡。
-
我想要存錢。
-
我想要從銀行帳戶取得帳戶擁有者名稱。
簡單啊!程式馬上寫出來(當然方法很多,以下寫法只是為了講解 operator overloading)
// 1. Compare
if (account1 > account2)
Console.WriteLine("account1's money is more than account2");
else
Console.WriteLine("account2's money is more than account1");
// 2. Add together
BankAccount account3 = account1 + account2;
// 3. Save
account3 = account3 + 500;
// 4. Get owner name from account class
string name = account3;
寫完發現上述的四個描述沒有一個 build 的過,這個時候就是 operator overloading 該出場的時候了。
Operator Overloading
在 BankAccount 新增幾個 method,讓上面的程式碼可以正常的運作
1. 我想要比較兩個戶頭裡的錢誰比較多。
// if (account1 > account2)
public static bool operator >(BankAccount left, BankAccount right)
{
if (left._money > right._money)
return true;
else
return false;
}
public static bool operator <(BankAccount left, BankAccount right)
{
if (left._money < right._money)
return true;
else
return false;
}
2. 我想要把兩個戶頭的錢存在一個共同戶頭裡。
// BankAccount account3 = account1 + account2;
public static BankAccount operator +(BankAccount left, BankAccount right)
{
return new BankAccount(left._owner + "+" + right._owner, left._money + right._money);
}
3. 我想要存錢。
// account3 = account3 + 500;
public static BankAccount operator +(BankAccount left, int right)
{
return new BankAccount(left._owner, left._money + right);
}
4. 我想要從銀行帳戶取得帳戶擁有者名稱。
// string name = account3;
public static implicit operator string(BankAccount account)
{
return account._owner;
}
這邊需要注意的是,沒有辦法只寫 “operator >” method,需把另一個 “operator <” 也實做出來才可 build 過。