重寫方法,重載方法,虛方法和抽象方法的使用
重寫方法,重載方法,虛方法和抽象方法。
重寫:指子類重新實現父類的某些方法,以實現一些新的功能。重寫的關鍵字是override。並且重寫的方法其簽名是相同的。
重載:指允許類中具有相同函數名的方法,但是其函數簽名必須是唯一的(順序,個數等)。重載的方法是在被調用的時候通過函數簽名確定需要調用哪一個方法。
虛方法:若一個實例方法的聲明中含有virtual修飾符,則稱該方法為虛方法(virtual method)。在調用一個虛方法時,該調用所涉及的那個實例的運行時類型
(runtime type)確定了要被調用的究竟是該方法的哪一個實現。
抽象方法:抽象方法是沒有實現的虛方法。抽象方法只能存在於抽象類中。抽象方法使用abstract修飾符進行聲明。
抽象方法只提供函數的聲明,至於函數的實現,必須要在子類中通過重寫實現。
重寫和虛方法:C#中的多態性在實現時主要是通過在子類(派生類)中重寫基類的虛方法或函數成員來實現的,那麽這裏就遇到兩個概念,一個是虛方法,另一個是重寫方法,而這兩個方法也是多態中最重要的兩個概念,下面分別對它們進行講解。
1.虛方法
虛方法就是允許被其子類重新定義的方法,在聲明時,需要使用virtual修飾符。
註意:
(1)virtual修飾符不能與static、abstract或者override修飾符同時使用;
(2)由於虛方法不能是私有的,所以,virtual修飾符不能與private修飾符同時使用。
例 使用virtual修飾符聲明一個虛方法,用來計算兩個數的和,代碼如下:
public virtual int Add(int x, int y) //定義一個虛方法
{
return x + y; //返回兩個數的和
}
2.重寫方法
如果一個方法聲明中含有override修飾符,則稱該方法為重寫方法,它主要用來使用相同的簽名重寫繼承的虛方法。虛方法主要用來引入新方法,而重寫方法則使從基類繼承而來的虛方法專用化(提供虛方法的具體實現)。
註意:
(1)override修飾符不能與new、static或者virtual修飾符同時使用,另外,重寫方法只能用於重寫基類中的虛方法,不能用來單獨聲明方法;
(2)重載和重寫是不相同的,重載是指編寫一個與已有方法同名,但參數列表不同的方法,而重寫是指在派生類中重寫基類的虛方法。
例 創建一個控制臺應用程序,首先定義一個基類,並在其中定義一個虛方法,用來計算兩個數的和;然後使Program類繼承於BaseClass類,並在該類中重寫基類中的虛方法,使其實現計算3個數的和;最後在Main方法中,使用派生類對象實例化基類的一個對象,並使用該基類對象調用派生類中的方法,實現計算3個數的和。代碼如下:
class BaseClass //定義一個基類
{
public virtual int Add(int x, int y) //定義一個虛方法
{
return x + y; //返回兩個數的和
}
}
class Program:BaseClass //定義一個派生類,繼承於BaseClass
{
static int z = 0; //定義一個靜態變量,用來作為第3個被加數
public override int Add(int x, int y) //重寫基類中的虛方法
{
return base.Add(x, y) + z; //計算3個數的和
}
static void Main(string[] args)
{
z = 698; //為靜態變量賦值
BaseClass baseclass = new Program(); //使用派生類對象實例化基類對象
Console.WriteLine(baseclass.Add(98, 368)); //調用派生類中重寫之後的方法
Console.ReadLine();
}
}
說明:
在Main方法中使用基類對象調用的Add方法是在派生中重寫之後的方法,這主要是因為虛方法的實現由派生類中的重寫方法進行了取代。
技巧:
在派生類中重寫基類中的虛方法時,可以使用base關鍵字調用基類中的虛方法。
重寫方法,重載方法,虛方法和抽象方法例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Override_Test { class Program { static void Main(string[] args) { //抽象類不能實例化 fatherClass father = new childClass(); childClass child = new childClass(); Console.WriteLine("fatherClass的Add方法:" + father.Add(1, 2)); //執行ChildClass中的Add方法 Console.WriteLine("childClass重寫fatherClass中的虛方法Add:" + child.Add(1, 2)); //執行ChildClass中的Add方法 Console.WriteLine("childClass重載Add方法:"+child.Add(1)); Console.WriteLine("childClass重載Add方法:" + child.Add(1,3,5)); Console.WriteLine("childClass重寫fartherClass中的抽象方法Add:" + father.StringFun("抽象方法")); //執行ChildClass中的StringFun方法 } } abstract class fatherClass { //構造 public fatherClass() { } //虛方法 public virtual int Add(int i, int j) { return i + j; } //抽象方法 public abstract string StringFun(string str); } class childClass : fatherClass { //構造 public childClass() { } //重寫父類虛方法Add 被重寫的父類方法 必須是virtual , abstract方法 public override int Add(int i, int j) { return i*2 + j; } public int Add(int i ) { return i; } public int Add(int i, int j, int k) { return i+j+k; } //重寫父類的抽象方法 public override string StringFun(string str) { return str; } } }
以上參考兩位博主:https://www.cnblogs.com/gq0324/p/8177645.html
https://www.cnblogs.com/ShuiMu/archive/2011/07/24/2115570.html
重寫方法,重載方法,虛方法和抽象方法的使用