程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#之重載與覆蓋

C#之重載與覆蓋

編輯: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
由此我們知道,當基類函數是虛函數時,基類函數不是重寫,而是覆蓋了基函數的同名函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved