一、C#中virtual與abstract的區別
C#的virtual & abstract經常讓人混淆,這兩個限定詞都是為了讓子類進行重新定義,覆蓋父類的定義。但是用法上差別很大。
a) virtual修飾的方法必須有方法實現(哪怕只有一對大括號),abstract修飾的方法不能有實現。
b) virtual可以被子類重寫,abstract必須被子類重寫
c) 如果類中的某一函數被abstact修飾,則類名也必須用abstact修飾
d) Abstract修飾的類不能被創建實例。
e) C#中如果准備在子類重寫父類的方法,則該方法在父類中必須用virtual修飾,在子類中必須用overide修飾。
注:用abstract修飾的類只能被繼承不能夠被實例化。
二、什么時候使用virtual什么時候使用abstract
a) virtual重點是實現多態,同一個方法能做不同的事情,也就是當一個方法會有不同的操作的時候要用virtual,例如:支付方法 pay(),可能通過微信去支付、也可能通過支付寶或者其他方式去支付,這個時候定義pay()方法的時候最好是用virtual修飾。
b) 作為一個必須存在的方法的時候用abstract,比如要定義一個人類對象Class Person{}和一個鳥類對象Class Bird{},人是動物,鳥也是動物,所以一般會先定義一個共同的基類Class animal{},然后讓人類和鳥類對象都繼承這個基類。這個基類可以有共通的屬性和方法,比如行走方法walk(),發聲方法voice(),在基類中這兩個方法都是不需要實現的,只需要在Person和Bird類中實現就可以了【Person和Bird類必需要實現這兩個方法,這也保證了所有繼承animal類的類都需要有walk()和voice()方法】,所以定義walk()和voice()方法的時候可以用abstract修飾