重寫是指重寫基類的方法,在基類中的方法必須有修飾符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 : Employee 18 { 19 public override void CalculatePay() 20 { 21 Console.WriteLine("Salary"); 22 } 23 } 24 25 class AppPay 26 { 27 public static void Main(String[] args) 28 { 29 //父類創建實例 30 Employee employee1 = new Employee(); 31 employee1.CalculatePay(); //Employee 32 33 //子類賦值給父類 34 Employee employee2 = new SalariedEmploy(); 35 employee2.CalculatePay(); // Salary 36 37 //子類創建實例 38 SalariedEmploy employee3 = new SalariedEmploy(); 39 employee3.CalculatePay(); //Salary 40 41 } 42 } 43 } 44 /* 45 Out: 46 Employe 47 Salary 48 Salary 49 */
*****************************************************************************************************************
C#之重載與覆蓋
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://www.cnblogs.com/jiajiayuan/archive/2011/09/15/2177051.html