重寫是指重寫基類的方法,在基類中的方法必須有修飾符virtual,而在子類的方法中必須指明override。 格式: 基類中: public virtual void myMethod() { } 子類中: public override void myMethod() { } 重寫以后,用基類對象和子類對象訪問myMethod()方法,結果都是訪問在子類中重新定義的方法,基類的方法相當于被覆蓋掉了。 重載 用于在給定了參數列表和一組候選函數成員的情況下,選擇一個最佳函數成員來實施調用。 public void test(int x,int y){} public void test(int x,ref int y){} public void test(int x,int y,string a){} 重載特征: I.方法名必須相同 II.參數列表必須不相同,與參數列表的順序無關 III.返回值類型可以不相同 ========================= 但如果有泛型,就要注意了! 多態 c#的多態性主要體現在類的繼承上: 子類繼承父類的時候,可能出現同名但方法定義不同的情況, 所以在子類中會將原方法覆蓋,實現自身的要求

1 /* 2 Function: override 3 */ 4 using System; 5 namespace TestOverride 6 { 7 class Employee 8 { 9 //父類虛方法10 public virtual void CalculatePay()11 {12 Console.WriteLine("Employee");13 } 14 }15 16 //子類繼承重寫CalculatePay()方法17 class SalariedEmploy : Employee18 {19 public override void CalculatePay()20 {21 Console.WriteLine("Salary");22 }23 }24 25 class AppPay26 {27 public static void Main(String[] args)28 {29 //父類創建實例30 Employee employee1 = new Employee();31 employee1.CalculatePay(); //Employee32 33 //子類賦值給父類34 Employee employee2 = new SalariedEmploy();35 employee2.CalculatePay(); // Salary36 37 //子類創建實例38 SalariedEmploy employee3 = new SalariedEmploy();39 employee3.CalculatePay(); //Salary40 41 } 42 }43 }44 /*45 Out:46 Employe47 Salary48 Salary49 */View Code*****************************************************************************************************************
overload:重載指的是同一個類中有兩個或多個名字相同但是參數不同的方法,(注:返回值不能區別函數是否重載),重載沒有關鍵字。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(); } }
我們知道,以上例子中,派生類存在一個對基類的重寫方法,所以結果為:I am F ,i=1若是我們把override換成new,那么如果是重寫的話,會和上面的結果相等,但實際結果是什么呢?實際的結果是:I am F由此我們知道,當基類函數是虛函數時,基類函數不是重寫,而是覆蓋了基函數的同名函數。
文章出處:http://m.survivalescaperooms.com/jiajiayuan/archive/2011/09/15/2177051.html
|
新聞熱點
疑難解答