它的作用就是產生子類的同時給于子類一些特定的屬性和方法。
abstract修飾符可以和類、方法、屬性、索引器及事件一起使用。在類聲明中使用abstract修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。
特性:
1.抽象類不能被實例化;
2.抽象類可以包含抽象方法和抽象訪問器;
3.不能用sealed修飾符修改抽象類,這意味著抽象類不能被繼承;
4.從抽象類派生的飛抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現。
總結:
~抽象方法是隱式的虛方法;
~只容許在抽象類中使用抽象方法聲明;
~因為抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,并且在簽名后沒有大括號“{}”,實現由一個重方法提供,此重方法是非抽象類的成員;
~在抽象方法聲明中使用static或virtual修飾符是錯誤的;
~除了在聲明和調用語法上不同外,抽象屬性的行為與抽象方法一樣;
~在靜態屬性上使用absteact修飾符是錯誤的;
~在派生類中,通過包括使用override修飾符的屬性聲明,可以重寫抽象的繼承屬性。

using System;abstract class A{ public abstract void F(); PRotected int _x; public abstract int X { get; set; }}class B:A{ public override void F() { } public override int X { get{return _x;} set{_x=value;} }}class Test{ static void Main() { B b=new B(); b.X=10; Console.Write(b.X); }}

using System;class A{ public void F() { Console.WriteLine("A.F"); } public virtual void G() { Console.WriteLine("A.G"); }}class B : A{ new public void F() { Console.WriteLine("B.F"); } public override void G() { Console.WriteLine("B.G"); }}class Test{ static void Main() { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G(); }}//輸出是:A.F B.F B.G B.G
簡單的說,虛方法就是可以被子類重寫的方法,如果子類重寫了虛方法,那么運行時將使用重寫后的邏輯,如果沒有重寫,則使用父類中虛方法的邏輯;
virtual關鍵字用于修飾方法、屬性、索引器或事件聲明,并且允許在派生類中重寫這些對象。
其實最重要的就是抽象方法不能實例化,要子類必須強制性的覆蓋它的方法 。而虛方法則是提供了選擇,可以覆蓋可以不覆蓋,繼承基類中的虛方法。
總結比較如下:
抽象方法和虛方法的區別 :
~抽象方法和虛方法的區別在于:虛擬方法有一個實現部分,并為派生類提供了覆蓋該方法的選項,相反,抽象方法沒有提供實現部分,強制派生類覆蓋方法(否則 派生類不能成為具體類);
~abstract方法只能在抽象類中聲明,虛方法則不是;
~abstract方法必須在派生類中重寫,而virtual則不必;
~abstract方法不能聲明方法實體,虛方法則可以。
轉自 Peterluo的技術博客
新聞熱點
疑難解答