重載
一個方法的名字和方法的參數列表稱為方法的簽名。C#根據方法簽名來識別方法,如果兩個方法簽名不同那麼他們就是兩個不同的方法。
重載可以是方法重載(包括構造函數重載)和運算符重載。方法重載指的是一組名字相同而參數列表不同的方法。但方法的返回值類型不同不能構成重載。
1 public static int max(int a, int b)
2 {
3
4 }
5
6 public static int max(int a, int b, int c)
7 {
8
9 }
C#中除了方法可以重載,運算符(+、-、*)也可以被重載。運算符重載允許一個類或者結構支持某種運算符運算。當然也可以用方法實現與運算符重載相同的功能,但在某些情況下,使用運算符重載比使用方法更符合人們日常的方式和習慣。
運算符重載語法如下:
public static 返回類型 operator 運算符(參數列表)
{
//運算過程代碼
}
在運算符重載定義語法中public、static和operator是固定的,必須在運算符重載定義中出現,public和static表示這個方法是公共的和靜態的,operator表示這是一個運算符重載方法。參數列表個數與具體運算符對應。
還有一種特殊的運算符重載,叫做類型轉換運算符重載。語法如下:
public static explicit|implicit operator 轉換目的類型(參數)
參數為待轉換的數據,轉換目的類型為想要得到的轉換後的數據類型,explicit表示轉換必須為顯示轉換,implicit表示轉換可以是隱式轉換。
如下一維向量重載“+”和類型轉換:
1 namespace OperatorOverload
2 {
3 //一維向量
4 class Vector
5 {
6 private int _rank = 0;
7 public int rank
8 {
9 get { return _rank; }
10 }
11
12 private double[] _values;
13 public double[] values
14 {
15 get { return _values; }
16 }
17
18 public Vector(int n)
19 {
20 _rank = n;
21 _values = new double[n];
22 }
23
24 public Vector(double[] doubleArray)
25 {
26 _rank = doubleArray.Length;
27 _values = doubleArray;
28 }
29
30 //+重載
31 public static Vector operator +(Vector a, Vector b)
32 {
33 if (a.rank == 0 || b.rank == 0)
34 return null;
35
36 //向量秩不相等無法相加
37 if (a.rank != b.rank)
38 return null;
39
40 double[] sum = new double[a.rank];
41 double[] valuesa = a.values;
42 double[] valuesb = b.values;
43
44 for (int i = 0; i < a.rank; i++)
45 {
46 sum[i] = valuesa[i] + valuesb[i];
47 }
48
49 Vector result = new Vector(sum);
50
51 return result;
52 }
53
54 //類型轉換重載
55 public static explicit operator double[](Vector v)
56 {
57 return v.values;
58 }
59
60 public static explicit operator Vector(double[] array)
61 {
62 return new Vector(array);
63 }
64
65 //重寫ToString方法
66 public override string ToString()
67 {
68 string result = "(";
69 for (int i = 0; i < _rank - 1; i++)
70 {
71 result += _values[i].ToString() + ", ";
72 }
73 result += _values[_rank - 1] + ")";
74
75 return result;
76 }
77 }
78 }
79
80 namespace OperatorOverload
81 {
82 class Program
83 {
84 static void Main(string[] args)
85 {
86 Vector a, b, c;
87
88 a = new Vector(new double[] { 11.1, 12.1, 13.1, 14.1, 15.1 });
89 b = new Vector(new double[] {22.2, 32.2, 33.2, 34.2, 35.2});
90 c = a + b;
91 Console.WriteLine("Vector a=" + a.ToString());
92 Console.WriteLine("Vector b=" + b.ToString());
93 Console.WriteLine("Vector a+b=" + c.ToString());
94
95 double[] array = new double[] { 1, 2, 3, 4, 5 };
96 Vector d = (Vector)array;
97
98 Console.WriteLine("array-->Vector: " + d.ToString());
99
100 Console.ReadLine();
101 }
102 }
103 }
運行結果
Vector a=(11.1, 12.1, 13.1, 14.1, 15.1) Vector b=(22.2, 32.2, 33.2, 34.2, 35.2) Vector a+b=(33.3, 44.3, 46.3, 48.3, 50.3) array-->Vector: (1, 2, 3, 4, 5)