虛擬與抽象
Virtual和Abstract是大多數面向對象(OO)編程語言(如Java和C)中使用的兩個關鍵字。儘管在不同的語言中它的含義略有不同,但虛擬關鍵字和抽象關鍵字都為它所附加的實體提供了一種部分實現的感覺。
摘要
通常,抽象類,也稱為抽象基類(ABC),不能實例化(不能創建該類的實例)。因此,只有當編程語言支持繼承(通過擴展類創建子類的能力)時,抽象類才有意義。抽象類通常表示一個抽象的概念或實體,有部分實現或沒有實現。因此,抽象類充當從中派生子類的父類,這樣子類將共享父類的不完整特性,並且可以添加功能來完成這些特性。抽象類可以包含抽象方法。擴展抽象類的子類可以實現這些(繼承的)抽象方法。如果子類實現了所有這樣的抽象方法,那麼它就是一個具體類。但如果不是這樣,子類也會變成抽象類。所有這一切意味著,當程序員指定一個類作為一個抽象類時,她是說這個類將是不完整的,它將有需要繼承子類完成的元素。這是在兩個程序員之間創建契約的好方法,它簡化了軟件開發中的任務。編寫代碼來繼承的程序員需要嚴格遵循方法定義(當然也可以有自己的實現)。在Java和C中,抽象類和方法是使用Abstract關鍵字聲明的。
事實上的
虛擬方法/函數提供了通過繼承類(使用具有相同簽名的函數)選擇性重寫其行為的能力。虛擬函數的概念在以下場景中很重要。假設一個類是由子類派生的,那麼每當使用派生類的對象時,它可能引用基類或派生類的對象。但是,如果基類方法被重寫,方法調用行為可能是不明確的。因此,為了解決這種模糊性,使用了虛擬關鍵字。如果方法標記為Virtual,則調用派生類的函數(如果有),否則調用基類的函數。例如,在C++中,虛擬關鍵字正好用於此目的。在C#中,Virtual關鍵字的使用方式類似,但除此之外,關鍵字重寫應用於修改所有重寫的方法。但是在Java中,沒有顯式的虛關鍵字。所有非靜態方法都被認為是虛擬的。沒有實體的虛函數稱為純虛函數。在Java和C中,抽象方法實際上是純虛擬的。
虛與抽象的區別