所謂重載指的是同一個類中有兩個或多個名字相同可是參數不一樣的方法。重載,必然發生在一個類中,函數名相同,參數類型或者順序不一樣構成重載,與返回類型無關。ide
override:過載也稱重寫是指子類對父類中虛函數或抽象函數的「覆蓋」(這也就是有些書將過載翻譯爲覆蓋的緣由),可是這種「覆蓋」和用new關鍵字來覆蓋是有區別的。
new:覆蓋指的是不一樣類中(基類或派生類)有兩個或多個返回類型、方法名、參數都相同,可是方法體不一樣的方法。
可是這種覆蓋是一種表面上的覆蓋,因此也叫隱藏,被覆蓋的父類方法是能夠調用獲得的。
重載覆蓋的發生條件:
重載,必然發生在一個類中,函數名相同,參數類型或者順序不一樣構成重載,與返回類型無關
重寫,必然發生在基類和派生類中,其類函數用virtual修飾,派生類用override修飾
覆蓋,在子類中寫一個和基類同樣名字(參數不一樣也算)的非虛函數,會讓基類中的函數被隱藏,編譯後會提示要求使用New關鍵字
重載示例:函數
public void Fun()
{
Console.WriteLine("I am F");
}
public void Fun(int i)
{
Console.WriteLine("I am F,i={0}",i);
}
override重寫特性:
由 override 聲明重寫的方法稱爲重寫基方法,重寫的基方法必須與 override 方法具備相同的簽名。
重寫的基方法必須是 virtual、abstract 或 override 的,不能重寫非虛方法或靜態方法。
override的方法和virtual的方法必須具備相同的訪問級別修飾符,不能更改 virtual 方法的可訪問性。
不能使用new、static 或 virtual 修飾符來修改 override 方法。
重寫屬性聲明必須指定與繼承屬性徹底相同的訪問修飾符、類型和名稱,而且被重寫的屬性必須是virtual、abstract 或 override 的。
覆蓋示例:
當咱們沒有使用覆蓋時,派生類繼承基類,結果以下:
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//結果爲:I am F
當咱們覆蓋原來的方法呢?
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public new void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//結果爲:I am F,i=1
new覆蓋與重寫、重載的區別:
當子類與父類的參數不一樣時
當基類函數不是虛函數時,基類函數將被隱藏。(由於子類和基類不在同一範圍內,因此不是重載)
當基類函數是虛函數時,基類函數將被隱藏。(由於子類和基類不在同一範圍內,因此不是重載;由於參數不一樣,因此不是重寫)
當子類與父類的參數相同時
當基類函數不是虛函數時,基類函數將被隱藏。(由於子類和基類不在同一範圍內,因此不是重載,由於基類不是虛函數,因此是隱藏不是重寫)
當基類函數是虛函數時,基類函數將被覆蓋。(由於子類和基類不在同一範圍內,因此不是重載)
那麼爲何不是重寫呢?咱們能夠作一個例子還測試一下,這個例子在虛函數時已經舉過,在這裏爲了說明此問題在重複一下:
class A
{
public virtual void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public override void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
A p = new Program();
p.Fun();
Console.Read();
}
}