前言
眾所周知,面向對象三大特點:封裝、繼承、多態。而今天我們將要學習的都是以多態為基礎的,而什么是多態呢?舉個不恰當的例子,比如你的對象,今天面對你是一副姿態,明天她給你戴綠帽子又是另一副模樣(這個例子是從一個博主那看到的),你的對象還是同一個人,但是可以根據使用的對象來展現不一樣的面貌,這,就是多態。簡單來說:多態就是在繼承的前提下,不同對象調用相同方法卻表現出不同的行為。注:本次示例使用VS Code.
虛方法:virtual
虛方法存在於相對於需要實現多態的子類的父類當中,同時也是實現多態的最基本的方法。
具體語法:父類的方法,用virtual修飾,表示虛方法。繼承它的子類,在內部用override進行重寫。下面進行案例分析:
貓和狗都是動物,他們都會叫,但是叫聲不一樣。提取出相同的部分,即叫聲,將叫聲實現為多態。
新建父類:Animal,新建子類Cat、Dog,代碼如下:





抽象方法和抽象類
抽象方法和抽象類的關鍵字都是:abstract
如果父類的方法很抽象,而且沒有具體的do(做什么)即方法體,必須要子類進行重寫才有實際意義的話,這種情況就需要用抽象方法了。
父類、子類及輸出:




抽象方法,必須存在於抽象類當中。相反,抽象類中不一定全部是抽象方法。比如我們可以在里面寫上普通方法,有實現的虛方法或者沒有實現的虛方法都可以。前面我們講的虛方法,假如子類需要完成多態的表現,而父類的方法實際上也有實際意義,那父類可以選擇實現,等需要子類重寫的時候去重寫實現調用,父類的方法暫時沒有實際意義,也可以不用具體實現。所以,父類的虛方法可以實現(有方法體),也可以不實現(沒有方法體)。而抽象方法必須通過子類的重寫來實現。
抽象類可以被實例化,但不能通過普通的實例化new,它只能通過父類的應用指向子類的實例來間接的實例化子類。
注意:抽象方法沒有方法體,繼承了抽象類的子類,必須實現父類的所有的抽象方法。
抽象類使用場景:
1.父類方法不知道如何去使用
2.父類沒有默認實現,而且不需要實例化
總的來說:抽象方法和虛方法差不多,實現的功能都差不多。抽象方法必須要包含在抽象類當中,而抽象類中可以不全是抽象方法。抽象類保證了所有的抽象方法必須得到重寫,而虛方法可以根據需要來選擇是否進行重寫。
接口:Interface
接口和抽象類差不多,區別在於,接口內包含的全部是未實現的方法。而且接口類和方法的關鍵詞不需要再聲明abstract,接口類的關鍵詞,interface,一般定義接口名稱,按照約定,我們會在名稱前面加上一個I。例如下圖的打印機接口。

里面有兩個未實現的方法。下面定義一個惠普打印機實現類,繼承自接口IPrinter

輸出:

總結可以如下圖:
