C#:abstarct 和 virtual關鍵字的區別分析,new 與 override關鍵字區別分析
阿新 • • 發佈:2018-12-08
1.首先
absratct 和 virtual 都是與繼承概念有關係。
2.區別
① virtual 關鍵字用於在父類中修飾方法,該方法在父類中可提供實現,並且子類中使用此方法有兩種方式。
方式1:
在父類中定義了virtual方法,在子類中沒有用override修飾該方法(不寫預設是new修飾或明顯的用new修飾),那麼在對(父類宣告的子類例項的物件)的呼叫中,該方法使用的是父類定義的方法。通過強制型別轉換,外面還可以呼叫父類的實現。
程式碼如下:
using System; namespace StudyLanguage { class Parent { public virtual void print() { Console.WriteLine("基類print()方法的列印"); } } class Child : Parent { public new void print() { Console.WriteLine("子類print()方法的列印"); } } class Test { static void Main(String[] args) { Console.WriteLine("子類宣告,子類例項的物件:"); Child child1 = new Child(); child1.print(); Console.WriteLine("強制轉換後的列印如下:"); ((Parent)child1).print(); Console.WriteLine("\n父類宣告,子類例項的物件:"); Parent parent1 = new Child(); parent1.print(); Console.Write("輸入任意按鍵結束退出..."); Console.ReadKey(); } } }
列印如下:
方式2:
在父類中定義了virtual方法,在子類中使用override重寫該方法。那麼在對(父類宣告的子類例項的物件)的呼叫中,該方法使用的是子類重寫的方法。通過強制型別轉換後,外面也不可以呼叫父類的實現。
程式碼如下:
using System; namespace StudyLanguage { class Parent { public virtual void print() { Console.WriteLine("基類print()方法的列印"); } } class Child : Parent { public override void print() { Console.WriteLine("子類print()方法的列印"); } } class Test { static void Main(String[] args) { Console.WriteLine("子類宣告子類例項的物件:"); Child child1 = new Child(); child1.print(); Console.WriteLine("強制轉換後的列印如下:"); ((Parent)child1).print(); Console.WriteLine("\n父類宣告子類例項的物件:"); Parent parent1 = new Child(); parent1.print(); Console.Write("輸入任意按鍵結束退出..."); Console.ReadKey(); } } }
列印如下:
為什麼 new 和 override 有如此區別?
override是重寫,即將父類的方法在子類裡直接抹去重新寫,故而呼叫的方法就是子類方法。
new只是將父類的方法在子類裡隱藏起來,故而呼叫的仍舊是父類方法。
② abstract 關鍵字只能用在抽象類中修飾方法,並且沒有具體的實現,子類必須使用override重寫方法。
程式碼如下:
using System; namespace StudyLanguage { abstract class Parent { public abstract void print(); } class Child : Parent { public override void print() { Console.WriteLine("子類print()方法的列印"); } } class Test { static void Main(String[] args) { Child child1 = new Child(); child1.print(); Console.WriteLine("強制轉換後的列印如下:"); ((Parent)child1).print(); Parent parent1 = new Child(); parent1.print(); Console.Write("輸入任意按鍵結束退出..."); Console.ReadKey(); } } }
注意:沒有 Parent p = new Parent(),因為Parent是抽象類。
3.介面 interface
1.介面只提供方法規約,不提供方法體;
2.介面中的方法不能用關鍵字(public也不行)修飾; 抽象類中可以有 public修飾方法
3.接口裡不能有介面和變數; 抽象類中可以有介面和變數
4.接口裡的方法在子類中必須全部實現;
5.介面可以實現多重繼承; 類只能單繼承,介面可以多繼承
示例程式碼如下:
using System;
namespace StudyLanguage
{
public interface MyInterFace
{
void getName();
}
abstract class Parent
{
public int id = 1;
interface Mi
{
int testMi();
}
public abstract void print();
}
class Child : Parent,MyInterFace
{
public override void print()
{
Console.WriteLine("重寫抽象類中的方法的列印");
}
public void getId()
{
//抽象類中的變數
Console.WriteLine(id);
}
public void getName()
{
Console.WriteLine("重寫介面中的方法的列印");
}
}
class Test
{
static void Main(String[] args)
{
Child child1 = new Child();
child1.print();
child1.getId();
child1.getName();
Console.Write("輸入任意按鍵結束退出...");
Console.ReadKey();
}
}
}
列印如下: