C#中的虛方法,抽象方法,抽象類以及接口

前言

衆所周知,面向對象三大特點:封裝、繼承、多態。而今天我們將要學習的都是以多態爲基礎的,而什麼是多態呢?舉個不恰當的例子,比如你的對象,今天面對你是一副姿態,明天她給你戴綠帽子又是另一副模樣(這個例子是從一個博主那看到的),你的對象還是同一個人,但是可以根據使用的對象來展現不一樣的面貌,這,就是多態。簡單來說:多態就是在繼承的前提下,不同對象調用相同方法卻表現出不同的行爲。注:本次示例使用VS Code.

虛方法:virtual

虛方法存在於相對於需要實現多態的子類的父類當中,同時也是實現多態的最基本的方法。

具體語法:父類的方法,用virtual修飾,表示虛方法。繼承它的子類,在內部用override進行重寫。下面進行案例分析:

貓和狗都是動物,他們都會叫,但是叫聲不一樣。提取出相同的部分,即叫聲,將叫聲實現爲多態。

新建父類:Animal,新建子類Cat、Dog,代碼如下:



v2-999d71d228e5c26b007a186ad831bec7_b.jpg




v2-bda057843dae76e80f0d19dc06ec6a61_b.jpg



v2-4ecb27bc612e76e9a2812b9757770a94_b.jpg




v2-309094edfea753e931a7bdae7317cfe2_b.jpg


調用小貓重寫的方法


v2-0d3b426b4115a6e5fdad3ae35ff58ec4_b.jpg


調用小狗重寫的方法


抽象方法和抽象類

抽象方法和抽象類的關鍵字都是:abstract

如果父類的方法很抽象,而且沒有具體的do(做什麼)即方法體,必須要子類進行重寫纔有實際意義的話,這種情況就需要用抽象方法了。

父類、子類及輸出:



v2-a040cf319e994fb0b566054e480ab411_b.jpg




v2-d9456e64f433adee8d857af9a7758883_b.jpg




v2-45c44006db4bf3974f35d2dde3ffc442_b.jpg



v2-0a77c70c539fee7f305fb61b463b7bbc_b.jpg


抽象方法,必須存在於抽象類當中。相反,抽象類中不一定全部是抽象方法。比如我們可以在裏面寫上普通方法,有實現的虛方法或者沒有實現的虛方法都可以。前面我們講的虛方法,假如子類需要完成多態的表現,而父類的方法實際上也有實際意義,那父類可以選擇實現,等需要子類重寫的時候去重寫實現調用,父類的方法暫時沒有實際意義,也可以不用具體實現。所以,父類的虛方法可以實現(有方法體),也可以不實現(沒有方法體)。而抽象方法必須通過子類的重寫來實現。

抽象類可以被實例化,但不能通過普通的實例化new,它只能通過父類的應用指向子類的實例來間接的實例化子類。

注意:抽象方法沒有方法體,繼承了抽象類的子類,必須實現父類的所有的抽象方法。

抽象類使用場景:

1.父類方法不知道如何去使用

2.父類沒有默認實現,而且不需要實例化

總的來說:抽象方法和虛方法差不多,實現的功能都差不多。抽象方法必須要包含在抽象類當中,而抽象類中可以不全是抽象方法。抽象類保證了所有的抽象方法必須得到重寫,而虛方法可以根據需要來選擇是否進行重寫。

接口:Interface

接口和抽象類差不多,區別在於,接口內包含的全部是未實現的方法。而且接口類和方法的關鍵詞不需要再聲明abstract,接口類的關鍵詞,interface,一般定義接口名稱,按照約定,我們會在名稱前面加上一個I。例如下圖的打印機接口。



v2-7d4c48bcbd2516c397c84708bfb230d7_b.jpg


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



v2-99ea264b36bbfb2a4206bd3b3835ed2e_b.jpg


輸出:


v2-b7c7de236f80eb0a6cc322769d858d7d_b.jpg


總結可以如下圖:



v2-7d9a6ed280e1461942f7c1979d11b204_b.jpg
相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。