C#:區分:重寫、覆蓋和過載以及虛方法和抽象方法
阿新 • • 發佈:2019-01-08
(一)重寫和覆蓋:
重寫:
在宣告時,父類的方法前面加上virtual關鍵字,子類的方法前面加上override關鍵字,且與父類方法同名,表示父類的方法可以被子類進行修改和重新定義。
覆蓋:
在宣告子類方法的時候,新增new關鍵字,定義與父類同名的方法,稱為覆蓋。
區別:
當用子類建立父類的時候,重寫呼叫的是子類中的功能,而覆蓋呼叫的仍然是父類的功能。用子類建立子類和用父類建立父類的時候,則相應的進行呼叫。
下面是當子類建立父類時,重寫和覆蓋的區別的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 重寫和覆蓋
{
class Program
{
static void Main(string[] args)
{
C1 c1 = new C2();
Console.WriteLine("重寫後的c1應該是:SonOverride; 螢幕顯示是:{0}",c1.FClass());
C3 c3 = new C4();
Console.WriteLine("覆蓋後的c3應該是:NewFather; 螢幕顯示是:{0}" , c3.nFClass());
Console.ReadKey();
}
#region 重寫方法的函式
public class C1 {
public virtual string FClass() {
return "FatherOverrride";
}
}
public class C2 : C1 {
public override string FClass()
{
return "SonOverride";
}
}
#endregion
#region 覆蓋方法的函式
public class C3 {
public string nFClass() {
return "NewFather";
}
}
public class C4 : C3 {
public new string nFClass()
{
return "NewSon";
}
}
#endregion
}
}
(二)過載和覆蓋
過載:
函式過載允許建立多個同名函式,每個函式可使用不同的引數型別。優點是不必顯示地指定要使用哪個函式,只需要提供一個數組引數,就可以根據引數型別執行相應的函式。
覆蓋:
參考(一)。
區別:
過載是發生在同一個類中,覆蓋是發生在一個父類和一個子類之間。
下面是過載的程式碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 函式過載
{
class Program
{
static void Main(string[] args)
{
int[] myArray1 = {1,2,3,100,5,6};
double[] myArray2 = {1.1,50.8,21,3.4,5};
int intmaxVal = MaxValue(myArray1);
double doublemaxVal = MaxValue(myArray2);
Console.WriteLine("int型別的返回最大值為{0}\ndouble型別的返回最大值為{1}",intmaxVal,doublemaxVal);
Console.ReadKey();
}
static int MaxValue(int[] myArray)
{
int maxValue = myArray[0];
for (int i = 0; i < myArray.Length;i++ ) {
if(maxValue<myArray[i]){
maxValue=myArray[i];
}
}
return maxValue;
}
static double MaxValue(double[] myArray)
{
double maxValue = myArray[0];
for (int i = 0; i < myArray.Length; i++)
{
if (maxValue < myArray[i])
{
maxValue = myArray[i];
}
}
return maxValue;
}
}
}
(三)虛方法和抽象方法
虛方法:用virtual關鍵字
使用方法:
(1)可以在子類(派生類)中用override重寫父類(基類)的方法
(2)可以在子類中直接由物件呼叫,使用基類中的方法
抽象方法:用abstract關鍵字
抽象方法是隻有定義、沒有實際方法體的函式,它只能在抽象函式中出現,並且必須在子類中重寫。