1.override: 父類:public virtual string ToString(){return "a";}
子類:public override string ToString(){return "b";}
2.overload: 同一類中或父子關係類中皆可.
public string ToString(){return "a";}
public string ToString(int id){return id.ToString();}
override是用於重寫基類的虛方法,這樣在衍生類別中提供一個新的方法;重載是提供了一種機制, 相同函數名通過不同的傳回值類型以及參數來表來區分的機制
================================================
很本質的區別就是看函數特徵:覆寫(Override)的兩個函數的函數特徵相同,重載(Overload)的兩個函數的函數名雖然相同,但函數特徵不同。
函數特徵包括函數名,參數的類型和個數。
Override 是在繼承的時候,如果你寫的函數與要繼承的函數函數特徵相同,那麼,加上這個關鍵字,在使用這個子類的這個函數的時候就看不見父類(或超類)的函數了,它被覆蓋掉了。
比如:Derived繼承了Base,Base裡面有void A(int a) ,那麼如果你Derived裡面覺得A寫得不好或不適合這個類,你想重新再寫一遍A裡的代碼,那麼就寫override void A(int a)這樣,原來的那個函數就被你新寫的這個覆蓋掉了。
Overload 是重載,就是說函數名相同,函數特徵不同,系統會根據你提供的參數來調相應的函數。
比如:void A(int a)和void A(int a,int b)
如果你用的是A(1)那麼調的是第一個,如果是A(1,1)那麼調的是第二個。
================================================
1. override
------------------
使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。
不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬、抽象的或重寫的。
也就是說,用 override 修飾符重寫的基類中的方法必須是 virtual, abstract 或 override 方法。
2. 重載(overload)
------------------
當類包含兩個名稱相同但簽名不同的方法時發生方法重載。
使用重載方法的指南:
a. 用方法重載來提供在語義上完成相同功能的不同方法。
b. 使用方法重載而不是允許預設參數。預設參數的版本控制效能不好,因此Common Language Specification(CLS)中不允許使用預設參數。
c. 正確使用預設值。在一個重載方法系列中,複雜方法應當使用參數名來指示從簡單方法中假定的預設狀態發生的更改。
d. 對方法參數使用一致的排序和命名模式。提供一組重載方法,這組重載方法帶有遞增數目的參數,以使開發人員可以指定想要的層級的資訊,這種情況很常見。您指定的參數越多,開發人員就可指定得越詳細。
e. 如果必須提供重寫方法的能力,請僅使最完整的重載是虛擬並根據它來定義其他動作。
下面這個例子代碼具體解釋一下這種模式,只有最後一個方法(參數最完整的方法)是虛方法,在繼承了這個類的子類中只要重寫(override)這個方法就行了。
Code
public class SampleClass
{
private string myString;
public void MyClass(string str)
{
this.myString = str;
}
public int IndexOf(string s)
{
return IndexOf (s, 0);
}
public int IndexOf(string s, int startIndex)
{
return IndexOf(s, startIndex, myString.Length - startIndex );
}
public virtual int IndexOf(string s, int startIndex, int count)
{
return myString.IndexOf(s, startIndex, count);
}
}