職業生涯知識回顧-關于抽象類和接口的思考

抽象類和接口是兩個很容易產生疑惑的概念,分不清它們的使用場景,其實只要記住兩點就比較好理解:

  1. 接口是對行為的抽象
  2. 抽象類是對子類有哪些屬性和行為的抽象

當你需要對一個類有哪些行為進行約束時,使用接口;需要為其他類提供一個模板以及一些通用的屬性和行為,使用抽象類。

在理解什么是抽象類和接口的前提下,延伸出一些思考:在一定程度上,接口似乎是比抽象類更底層的存在,是否可以理解為先有行為,對行為進行組合才能有類?

那么下面代碼中,抽象類對接口的實現有沒有實際意義?

<?phpinterface IAnimal
{public function move(): void;public function sleep(): void;public function eat(): void;
}interface Wag
{public function wag();
}interface Climb
{public function climb();
}abstract class AbstractAnimal implements IAnimal
{abstract function move(): void;public function sleep(): void{echo 'sleeping', PHP_EOL;}public function eat(): void{echo 'eating', PHP_EOL;}
}class Dog extends AbstractAnimal implements Wag
{function move(): void{echo 'dog running', PHP_EOL;}public function wag(): void{echo 'wagging', PHP_EOL;}
}class Cat extends AbstractAnimal implements Climb
{function move(): void{echo 'cat walking quietly', PHP_EOL;}public function climb(): void{echo 'climbing', PHP_EOL;}
}

如果更進一步,抽象類的方法和接口相同,并且都是抽象方法的情況下,接口和抽象類誰更有存在的意義?

抽象類是為了提高代碼復用,定義類之間的層次關系,接口是為了實現多態性和解耦。我們要知道兩者并不是對立關系,甚至目標一致,都是為了提高代碼質量。

工具是死的,但人是活的,所以我認為使用者并不用太過于糾結,代碼沒有百分百完美,也不是死板的教條。只要在需求和設計目標明確的前提下,選擇抽象類或接口,甚至組合起來使用都是可以的,解決實際問題才是我們最終的目的……

最后,再來回答一下前邊的三個問題:

  1. 抽象類和接口的層級關系:抽象類可以被視為介于接口和類之間的一種中間形式。
  2. 抽象類實現接口的意義:統一接口規范,確保抽象類和子類都遵循接口的約束。
  3. 全抽象方法的抽象類和接口誰更有意義:如果只是定義方法契約而不提供具體實現,接口更有意義;抽象類有明確擴展目標時,保留抽象類。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715886.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bulingbuling - 《歷史的教訓》 [ The Lessons of History ]

《歷史的教訓》 兩位當代最偉大思想家的著名論文集&#xff0c;匯集了 5000 多年的歷史 作者&#xff1a;威爾-杜蘭特和阿里爾-杜蘭特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …

Spring Boot項目中不使用@RequestMapping相關注解,如何動態發布自定義URL路徑

一、前言 在Spring Boot項目開發過程中&#xff0c;對于接口API發布URL訪問路徑&#xff0c;一般都是在類上標識RestController或者Controller注解&#xff0c;然后在方法上標識RequestMapping相關注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

Siamrpn++論文中文翻譯(詳細!)

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks SiamRPN&#xff1a;具有非常深度網絡的Siamese視覺跟蹤的進化 【siamrpn論文地址】 https://arxiv.org/abs/1812.11703 摘要 基于Siamese網絡的跟蹤器將跟蹤表示為目標模板和搜索區域之間的卷積特征…

【STA】多場景時序檢查學習記錄

單周期路徑 建立時間時序檢查 在時鐘的有效沿到達觸發器之前&#xff0c;數據應在一定時間內保持穩定&#xff0c;這段時間即觸發器的建立 時間。滿足建立時間要求將確保數據可靠地被捕獲到觸發器中。 建立時間檢查是從發起觸發器中時鐘的第一個有效沿到捕獲觸發器中時鐘后面…

理解大模型的5個關鍵公式

理解大模型的5個關鍵公式_嗶哩嗶哩_bilibili PPT&#xff1a;https://link.excalidraw.com/p/readonly/aBWlNjEckdUlrszwwo6V

基于springboot+vue的社區醫院管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

chatgpt-3的文章生成器有哪些?可以批量生成文章的生成器

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;作為人工智能領域的一項重大突破&#xff0c;開啟了新一代的文本生成技術。同時市面上也涌現出了一些GPT-3文章生成器&#xff0c;為用戶提供了快速、高效地生成各種類型文章的工具。本文將介紹一些中國的GP…

unity-unity2d基礎操作筆記(三)0.5.000

目標是:牢記以下137條操作,越級上升到中級階段 unity-unity2d基礎操作筆記(三) 一百零一、如何操作一個游戲物體由多個部分組成的動畫一百零二、如何使用rigidbody 2d進行物體移動一百零三、獲取游戲物體身上的組件方法一百零四、代碼控制物體朝向一百零五、不使用插件,純…

C#上位機調試經驗

1.使用Visual Studio的遠程工具 因為上位機軟件安裝在工控機上&#xff0c;不方便調試。如果直接把代碼放在工控機上&#xff0c;又不太安全。 可以在工控機上安裝一個Visual Studio的遠程工具&#xff0c;把隨身帶的筆記本電腦通過網線插在工控機上 這樣可以在筆記本上使用…

s3cmd工具使用

1. 安裝s3cmd工具 [roottestserver01 ~]# yum install s3cmd 2. 配置s3cmd, 按提示輸入相應的ak&#xff0c;sk&#xff0c;endpoint等信息 [roottestserver01 ~]# s3cmd --configure 3. s3cmd使用 [roottestserver01 ~]# s3cmd mb s3://abc &#xff08;創建一個桶&am…

python筆記_程序流程控制

A&#xff0c;順序控制 程序從上到下逐行執行 python定義變量時&#xff0c;會合法地向前引用 age 1 age2 age 1 age2 age 1 age 1 ——>錯誤&#xff0c;age應在age2之前 B&#xff0c;分支控制 1&#xff0c;單分支if 語法 if 條件表達式 &#xff1a; 代碼塊 說明…

【六】【SQL】多表查詢,笛卡爾積

笛卡爾積 笛卡爾積發生在當你在查詢中將兩個或多個表進行交叉連接&#xff08;CROSS JOIN&#xff09;或者沒有指定任何連接條件時。假設第一個表有M行&#xff0c;第二個表有N行&#xff0c;那么結果集將包含M x N個記錄。在大多數情況下&#xff0c;笛卡爾積并不是你想要的結…

數字化轉型導師堅鵬:證券公司數字化思維升級之道

證券公司數字化思維升級之道 ——數字化思維之六脈神劍 課程背景&#xff1a; 很多證券公司存在以下問題&#xff1a; 不知道數字化轉型如何改變思維模式&#xff1f; 不清楚需要建立什么樣的數字化思維&#xff1f; 不知道如何開展數字化思維提升工作&#xff1f; 課…

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基礎 CRUD&#xff08;創建、讀取、更新和刪除&#xff09;操作的一個接口。在與 Redis 集成時&#xff0c;盡管 Redis 是一個鍵值存儲系統&#xff0c;并沒有像關系型…

華為機試真題實戰應用【算法代碼篇】-去除多余空格(附Java、C++和python代碼)

目錄 問題描述 輸入描述 輸出描述 樣例 思路解析 代碼實現

關于福彩歷史數據采集器和體彩歷史數據采集器的下載安裝說明

前段時間因為研究基于人工神經網絡&#xff08;深度學習&#xff0c;所謂的“AI”算法&#xff09;對3D開獎數據進行預測&#xff0c;開發了兩款瀏覽器插件----“福彩歷史數據采集器”和“體彩歷史數據采集器”。之所以開發這兩款插件&#xff0c;是因為不管是基于什么樣的方式…

Unity 游戲設計模式:觀察者模式

本文由 簡悅 SimpRead 轉碼&#xff0c; 原文地址 mp.weixin.qq.com 在 unity 游戲設計中&#xff0c;觀察者模式&#xff08;Observer Pattern&#xff09;有著重要的作用&#xff0c;它主要用于實現對象之間的一對多的依賴關系&#xff0c;當一個對象的狀態發生變化時&#x…

【QT+QGIS跨平臺編譯】之六十三:【QGIS_CORE跨平臺編譯】—【錯誤處理:未定義的類QgsMapLayer - QgsMapLayerModel】

文章目錄 一、未定義的類QgsMapLayer二、解決辦法 一、未定義的類QgsMapLayer 報錯&#xff1a; 二、解決辦法 QgsMapLayerModel.h文件中 ①第27行修改為&#xff1a; #include "QgsMapLayer.h" ②第23行增加&#xff1a; #include <QPointer>

Github 2024-03-03 開源項目日報Top9

根據Github Trendings的統計&#xff0c;今日(2024-03-03統計)共有9個項目上榜。根據開發語言中項目的數量&#xff0c;匯總情況如下&#xff1a; 開發語言項目數量非開發語言項目4Rust項目1C項目1Jupyter Notebook項目1Python項目1Shell項目1 任天堂Switch模擬器yuzu&#x…

將jar程序封裝為docker鏡像 shell腳本

將JAR程序封裝為Docker鏡像通常涉及編寫一個Dockerfile&#xff0c;然后使用docker build命令構建鏡像。然而&#xff0c;如果你想要通過一個shell腳本來自動化這個過程&#xff0c;你可以創建一個腳本&#xff0c;該腳本首先創建一個Dockerfile&#xff0c;然后使用docker bui…