解讀一
c# 中 abstract和virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別:
一、virtual方法(虛方法)
virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類例項的呼叫中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類例項的呼叫中,該虛方法使用的是派生重寫的方法。
二、abstract方法(抽象方法)
abstract關鍵字只能用在抽象類中修飾方法,並且沒有具體的實現。抽象方法的實現必須在派生類中使用override關鍵字來實現。
介面和抽象類最本質的區別:抽象類是乙個不完全的類,是對物件的抽象,而介面是一種行為規範。
三、關鍵字
static:當乙個方法被宣告為static時,這個方法是乙個靜態方法,編譯器會在編譯時保留這個方法的實現。也就是說,這個方法屬於類,但是不屬於任何成員,不管這個類的例項是否存在,它們都會存在。就像入口函式static void main,因為它是靜態函式,所以可以直接被呼叫。
virtua:當乙個方法被宣告為virtual時,它是乙個虛擬方法,直到你使用classname variable = new classname();宣告乙個類的例項之前,它都不存在於真實的記憶體空間中。這個關鍵字在類的繼承中非常常用,用來提供類方法的多型性支援。
overrride:表示重寫 這個類是繼承於shape類
virtual,abstract是告訴其它想繼承於他的類 你可以重寫我的這個方法或屬性,否則不允許。
abstract:抽象方法宣告使用,是必須被派生類覆寫的方法,抽象類就是用來被繼承的;可以看成是沒有實現體的虛方法;如果類中包含抽象方法,那麼類就必須定義為抽象類,不論是否還包含其他一般方法;抽象類不能有實體的。
a) virtual修飾的方法必須有方法實現(哪怕只有一對大括號),abstract修飾的方法不能有實現。
b) virtual可以被子類重寫,abstract必須被子類重寫
c) 如果類中的某一函式被abstact修飾,則類名也必須用abstact修飾
d) abstract修飾的類不能被建立例項。
e) c#中如果準備在子類重寫父類的方法,則該方法在父類中必須用virtual修飾,在子類中必須用overide修飾,避免了程式設計師在子類中不小心重寫了父類父類方法。
注:用abstract修飾的類只能被繼承不能夠被例項化。
解讀二virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。
它們有乙個共同點:如果用來修飾方法,前面必須新增public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類重新定義的,而private成員是不能被子類訪問的。
但是它們的區別很大。(virtual是「虛擬的」,abstract是「抽象的").
(1)virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現:
public class test1錯誤:「test1.fun1()」必須宣告主體,因為它未標記為 abstract、extern 或 partial
對於abstract修飾的方法如果有實現:
public abstract class test2錯誤: 「test2.fun2()」無法宣告主體,因為它標記為 abstract}
(2)virtual可以被子類重寫,而abstract必須被子類重寫。
class basetest1//必須有實現
}class derivetest1:basetest1
}
編譯不會出現錯誤,如果重寫了virtual修飾的方法,前面必須新增override(這樣就告訴了編譯器你要重寫虛擬方法),而且必須有實現,否則編譯出錯:
abstract class basetest2class derivetest2 : basetest2
錯誤2:重寫時沒有新增override
//override void fun() 錯誤3:虛擬成員或者抽象成員不能是私有的(只要在父類中宣告了虛擬成員或抽象成員,即便是繼承的也要加上這個限制)
public override void fun() //如果重寫方法; 錯誤:「a.derivetest2」不實現繼承的抽象成員「a.basetest2.fun()」
}
(3)如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法。
(4)無法建立abstract類的例項,只能被繼承無法例項化,比如: basetest2 base2 = new basetest2();將出現編譯錯誤:抽象類或介面不能建立例項。
(5)c#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前新增override,這樣就避免了程式設計師在子類中不小心重寫了父類方法。
(6)abstract方法必須重寫,virtual方法必須有實現(即便它是在abstract類中定義的方法)。
abstract public class test}public class class1 : test*/}
C 中Abstract和Virtual使用
1.abstract 抽象類 應該算是介面和類的中間型別 2.abstract使用時被子類繼承 3.abstract無法例項化 4.abstract使用位置應該是 架構的最底層,用來實現一些公用方法 5.abstract類中可以有非abstract修飾的方法和屬性 6.繼承abstract類的子類一...
C 中 virtual 和 abstract 區別
1 這兩個都是用來修飾類和方法的 2 都不能用private修飾 3 virtual 虛擬 abstract 抽象 4 virtual修飾的方法必須有主體 而且子類可以不去實現這個方法 如果子類不重寫這個虛函式 在子類裡呼叫這個方法呼叫的是父類裡的 5 abstract修飾的方法不能有主體 子類必須...
C 中virtual和abstract的區別
c 的virtual abstract經常讓人混淆,這兩個限定詞都是為了讓子類進行重新定義,覆蓋父類的定義。但是用法上差別很大。a virtual修飾的方法必須有方法實現 哪怕只有一對大括號 abstract修飾的方法不能有實現。b virtual可以被子類重寫,abstract必須被子類重寫 c ...