C#之重載與覆蓋

overload:重載指的是同一個類中有兩個或多個名字相同可是參數不一樣的方法,(注:返回值不能區別函數是否重載),重載沒有關鍵字
override:過載也稱重寫是指子類對父類中虛函數或抽象函數的「覆蓋」(這也就是有些書將過載翻譯爲覆蓋的緣由),可是這種「覆蓋」和用new關鍵字來覆蓋是有區別的。
new:覆蓋指的是不一樣類中(基類或派生類)有兩個或多個返回類型、方法名、參數都相同,可是方法體不一樣的方法。
可是這種覆蓋是一種表面上的覆蓋,因此也叫隱藏,被覆蓋的父類方法是能夠調用獲得的。
重載覆蓋的發生條件:
重載,必然發生在一個類中,函數名相同,參數類型或者順序不一樣構成重載,與返回類型無關
重寫,必然發生在基類和派生類中,其類函數用virtual修飾,派生類用override修飾
覆蓋,在子類中寫一個和基類同樣名字(參數不一樣也算)的非虛函數,會讓基類中的函數被隱藏,編譯後會提示要求使用New關鍵字
重載示例:
ide

複製代碼
 public void Fun() { Console.WriteLine("I am F"); } public void Fun(int i) { Console.WriteLine("I am F,i={0}",i); }
複製代碼

override重寫特性:
 override 聲明重寫的方法稱爲重寫基方法,重寫的基方法必須與 override 方法具備相同的簽名。
重寫的基方法必須是 virtualabstract  override 
,不能重寫非虛方法或靜態方法
override的方法和virtual的方法必須具備相同的訪問級別修飾符
,不能更改 virtual 方法的可訪問性
不能使用newstatic  virtual 修飾符來修改 override 方法。

重寫屬性聲明必須指定與繼承屬性徹底相同的訪問修飾符、類型和名稱,而且被重寫的屬性必須是virtualabstract  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覆蓋與重寫、重載的區別:
當子類與父類的參數不一樣時
當基類函數不是虛函數時,基類函數將被隱藏。(由於子類和基類不在同一範圍內,因此不是重載)
當基類函數是虛函數時,基類函數將被隱藏。(
由於子類和基類不在同一範圍內,因此不是重載;由於參數不一樣,因此不是重寫
當子類與父類的參數相同時
當基類函數不是虛函數時,基類函數將被隱藏。(由於子類和基類不在同一範圍內,因此不是重載,由於基類不是虛函數,因此是隱藏不是重寫)
當基類函數是虛函數時,基類函數將被覆蓋。(由於子類和基類不在同一範圍內,因此不是重載)
那麼爲何不是重寫呢?咱們能夠作一個例子還測試一下,這個例子在虛函數時已經舉過,在這裏爲了說明此問題在重複一下: spa

複製代碼
  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(); } }
複製代碼

咱們知道,以上例子中,派生類存在一個對基類的重寫方法,因此結果爲:I am F ,i=1
如果咱們把override換成new,那麼若是是重寫的話,會和上面的結果相等,但實際結果是什麼呢?
實際的結果是:I am F
由此咱們知道,當基類函數是虛函數時,基類函數不是重寫,而是覆蓋了基函數的同名函數。 翻譯

相關文章
相關標籤/搜索