C#中區別多態、重載、重寫


重寫是指重寫基類的方法,在基類中的方法必須有修飾符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 */
View Code

 

*****************************************************************************************************************

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM