壹. 相同
他們有些相似。有些場景用哪個都行!
1. 修飾父類、讓子類重寫
virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。
2. 都用必須public
如果用來修飾方法,前面必須添加public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract 就是讓子類重新定義的,而private成員是不能被子類訪問的。
貳. 區別
但是它們的區別很大。(virtual是“虛擬的”,abstract是“抽象的")。
1. 必須實現、必須沒有實現 指父類中
virtual修飾的方法必須有實現(哪怕是僅僅添加一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現則會報錯。
2.可以重寫、必須重寫
virtual可以被子類重寫,而abstract必須被子類重寫,
3.必須在抽象類
如果類成員被abstract修飾,則該類前必須添加abstract,因為只有抽象類才可以有抽象方法。
4.無法實例化
無法創建abstract類的實例,只能被繼承無法實例化,強行new出來 將出現編譯錯誤:抽象類或接口不能創建實例。
補充: C#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前添加override,這樣就避免了程序員在子類中不小心重寫了父類方法。