抽象類定義:
它的作用就是產生子類的同時給於子類一些特定的屬性和方法。
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);
- }
- }
虛方法定義:
簡單的說,虛方法就是可以被子類重寫的方法,如果子類重寫了虛方法,那麼運行時將使用重寫後的邏輯,如果沒有重寫,則使用父類中虛方法的邏輯;
virtual關鍵字用於修飾方法、屬性、索引器或事件聲明,並且允許在派生類中重寫這些對象。
輸出是:A.F B.F B.G B.G
- 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( ) ;
- }
- }
其實最重要的就是抽象方法不能實例化,要子類必須強制性的覆蓋它的方法 。而虛方法則是提供了選擇,可以覆蓋可以不覆蓋,繼承基類中的虛方法。
總結比較如下:
抽象方法和虛方法的區別 :
~抽象方法和虛方法的區別在於:虛擬方法有一個實現部分,併爲派生類提供了覆蓋該方法的選項,相反,抽象方法沒有提供實現部分,強制派生類覆蓋方法(否則 派生類不能成爲具體類);
~abstract方法只能在抽象類中聲明,虛方法則不是;
~abstract方法必須在派生類中重寫,而virtual則不必;
~abstract方法不能聲明方法實體,虛方法則可以。
另外說一下override修飾符
(http://msdn.microsoft.com/zh-cn/library/ebca9ah3(v=vs.80).aspx)
要擴展或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用 override 修飾符。
override 方法提供從基類繼承的成員的新實現。通過 override 聲明重寫的方法稱爲重寫基方法。