uml類關系(實現、繼承,聚合、組合,依賴、關聯)

drawio和EA是架構設計時經常使用的畫圖工具。

drawio學習門檻低,使用靈活,但是功能僅僅限于畫圖。

EA學習門檻高,但是功能更加的豐富:

①在畫圖方面,EA嚴格滿足UML標準,EA中的圖和類是關聯的,如果修改了一個類的名字或者函數等,在引用這個類的圖中也會自動修改

②EA還可以將架構設計時定義的類、接口等導出為代碼

③EA可以導入已有的代碼,生成類圖

類似于表寫代碼,drawio類似于一種純編輯器的代碼,沒有其它輔助的功能,EA類似于一個有豐富功能的IDE,可以有各種各樣的提示,提供一種沉浸式的使用環境。

當討論uml,最常見的使用場景就是類圖。常用的類之間的關系包括實現、繼承、聚合、組合、關聯、依賴,而這六種關系中實現和繼承關系類似,聚合和組合類似,依賴和關聯類似。

本文中的類圖使用EA來畫。

1實現和繼承

實現:

實現說的是類實現接口。在c++中,沒有接口這個概念,抽象類可以看做接口。c++中的抽象類,是至少有一個函數是純虛函數,這樣的類不能實例化對象。如果以java語言的標準來定義c++中的接口和抽象類,那么接口中的函數都是純虛函數,都沒有自己的實現,抽象類中是至少有一個函數是純虛函數,也可以有不是純虛函數的函數。但是在很多時候,接口和抽象類的邊界也沒有這么清晰。接口可以看做是對類的行為的約束,值提供規則,不提供實現,就像很多行業中的標準制定者,只定義標準,不提供實現,比如網絡通信協議標準、autosar標準等。

接口只定義標準,不提供實現,所以一個類對接口進行實現,就是實現的關系。當然,一個接口也可以繼承一個接口。

如下代碼,有一個接口類Shape,有兩個實現類Rectangle和Circle。Rectancle和Circle是對Shape的實現。

#include <iostream>
#include <cmath>
#include <stdexcept>// Shape 接口類
class Shape {
public:virtual ~Shape() {} // 虛析構函數// 獲取面積virtual double getArea() const = 0;// 獲取周長virtual double getPerimeter() const = 0;// 打印形狀信息virtual void printInfo() const {std::cout << "Area: " << getArea()<< ", Perimeter: " << getPerimeter() << std::endl;}
};// 矩形類
class Rectangle : public Shape {
private:double width, height;public:Rectangle(double w, double h) : width(w), height(h) {if (width <= 0 || height <= 0) {throw std::invalid_argument("Width and height must be positive");}}double getArea() const override {return width * height;}double getPerimeter() const override {return 2 * (width + height);}void printInfo() const override {std::cout << "Rectangle with width: " << width<< ", height: " << height << std::endl;Shape::printInfo();}
};// 圓形類
class Circle : public Shape {
private:double radius;static constexpr double PI = 3.14159265358979323846;public:Circle(double r) : radius(r) {if (radius <= 0) {throw std::invalid_argument("Radius must be positive");}}double getArea() const override {return PI * radius * radius;}double getPerimeter() const override {return 2 * PI * radius;}void printInfo() const override {std::cout << "Circle with radius: " << radius << std::endl;Shape::printInfo();}
};int main() {try {// 創建各種形狀Shape* shapes[] = {new Rectangle(4, 5),new Circle(3)};// 測試每個形狀for (Shape* shape : shapes) {shape->printInfo();std::cout << std::endl;delete shape;}} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}

Rectangle和Circle堆Shape的實現關系,就可以表示為下圖。實現關系用?三角形加虛線來表示。

繼承:

實現是對一個沒有實現的接口類進行實例化,進行實現,是一個從抽象到具體的過程。而繼承是為了復用,繼承說的是派生類和基類之間的關系。

還是以上邊的圖形類代碼為例子,如果我們新增一個正方形的類,正方形是一個長和寬相等的特殊的矩形,所以正方形可以繼承矩形。那么正方形類的代碼如下:

// 正方形類
class Square : public Rectangle {
public:Square(double length) : Rectangle{length,length} {}
};

實現是為了多態,繼承是為了復用,可以看到,正方形類可以服用矩形類的函數和屬性,正方形類只需要實現自己的構造函數即可。

繼承關系用三角形加實現來表示。實現和繼承的區別是,一個是虛線,一個是實線。

2聚合和組合

聚合和組合,兩者均是表示整體與部分的關系,但是也是有區別的:

聚合:整體不存在了,部分還可以單獨存在

比如汽車和輪胎、發送機、變速箱的關系,汽車是由輪胎、發動機、變速箱等聚合而成,但是輪胎、發動機、變速箱可以單獨生產,在不有裝車之前就可以存在,如果汽車要處理掉,這輛車可以拆卸,拆卸之后,汽車不存在了,汽車的零件還可以單獨存在。

組合:整體不存在了,部分也就不存在了

比如公司和部門的關系,我們沒有見過不依賴于公司而獨立存在的部門,部門都是存在于公司內的,當公司倒閉,那么部門也就不存在了。

可以看到部分和整體之間的關系,組合的依賴更強。

下圖是聚合的關系,聚合用空心菱形加實線表示。

下圖是組合關系,組合用實心菱形加實現表示。

3依賴和關聯

依賴關系也可以叫引用關系,也可以叫使用關系,說的是在一個對象中使用了另一個對象,那么就可以說前者依賴后者。比如程序員在工作中會用到電腦,那么就可以說兩者的關系是依賴關系。

依賴關系如下圖所示,依賴用箭頭和虛線表示。

個人感覺關聯和依賴之間的概念,并不是很清晰,沒有很清晰的邊界,有時候關聯可以看做依賴,依賴也可以看做關聯。?關聯關系分單向關聯、雙向關聯、自關聯、多維關聯。

單向關聯,箭頭加實線表示。

雙向關聯,實線兩端均有箭頭,也可以兩端均沒有箭頭。

自關聯,指向自身的實線表示,可以帶箭頭,也可以不帶。

多維關聯,表示多個對象之間的關聯關系,可以用一個菱形來表示,當然也可以在多個對象之間兩兩關聯來表示。

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

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

相關文章

C++如何設計線程池(thread pool)來提高線程的復用率,減少線程創建和銷毀的開銷

線程池的基本概念與多線程編程中的角色 線程池&#xff0c;顧名思義&#xff0c;是一種管理和復用線程的資源池。它的核心思想在于預先創建一定數量的線程&#xff0c;并將這些線程保持在空閑狀態&#xff0c;等待任務的分配。一旦有任務需要執行&#xff0c;線程池會從池中取出…

React.memo 和 useMemo

現象 React 中&#xff0c;通常父組件的某個state發生改變&#xff0c;會引起父組件的重新渲染&#xff08;和其他state的重新計算&#xff09;&#xff0c;從而會導致子組件的重新渲染&#xff08;和其他非相關屬性的重新計算&#xff09; 問題一&#xff1a;如何避免因為某個…

防火墻技術深度解析:從包過濾到云原生防火墻的部署與實戰

防火墻技術深度解析&#xff1a;從包過濾到云原生防火墻的部署與實戰 在網絡安全防御體系中&#xff0c;防火墻是第一道物理屏障&#xff0c;承擔著“網絡流量守門人”的核心角色。從早期基于IP地址的包過濾設備到如今集成AI威脅檢測的云原生防火墻&#xff0c;其技術演進始終…

strcmp()在C語言中怎么用(附帶實例)

C語言標準庫中的 strcmp() 函數用于比較兩個字符串。 strcmp() 函數原型如下&#xff1a; int strcmp (const char * str1, const char * str2); const char *str1 表示待比較字符串 1 的首地址&#xff1b;const char *str2 表示待比較字符串 2 的首地址。 如果兩個字符串相…

搜廣推校招面經八十二

一、L1 和 L2 正則化的區別&#xff1f;對數據分布有什么要求&#xff0c;它們都能防止過擬合嗎&#xff1f; 1.1. L1 與 L2 正則化的區別 特性L1 正則化&#xff08;Lasso&#xff09;L2 正則化&#xff08;Ridge&#xff09;正則項λ * ∑|w?| λ ? ∑ ( w i 2 ) λ * ∑…

數據結構和算法(九)--紅黑樹

一、紅黑樹 1、紅黑樹 前面介紹了2-3樹&#xff0c;可以看到2-3樹能保證在插入元素之后&#xff0c;樹依然保持平衡狀態&#xff0c;它的最壞情況下所有子結點都是2-結點&#xff0c;樹的高度為IgN&#xff0c;相比于我們普通的二叉查找樹&#xff0c;最壞情況下樹的高度為N,確…

工業攝像頭通過USB接口實現圖像

工業攝像頭系列概覽&#xff1a;類型與應用 工業攝像頭系列涵蓋了多種類型&#xff0c;以滿足不同行業和應用的需求。以下是對工業攝像頭系列的一些介紹&#xff1a; 一、主要類型與特點 USB工業攝像頭 &#xff1a;這類攝像頭通常通過USB接口與計算機連接&#xff0c;適用于…

使用Django框架表單

使用Django框架表單 文章目錄 使用Django框架表單[toc]1.使用Form類構建表單2.表單字段與Widget控件 1.使用Form類構建表單 【創建項目和應用】 PS C:\Users\ls> cd E:\Python\ PS E:\Python> django-admin.exe startproject FormSite PS E:\Python> cd .\FormSite\…

docker配置mysql遇到的問題:網絡連接超時、啟動mysql失敗、navicat無法遠程連接mysql

目錄 1.網絡超時 方式1. 網絡連接問題 方式2. Docker鏡像源問題 方式3.使用國內鏡像源 2.啟動mysql鏡像失敗 3.navicat無法遠程連接mysql 1.網絡超時 安裝MySQL時出現超時問題&#xff0c;可能由多種原因導致&#xff1a; 方式1. 網絡連接問題 原因&#xff1a;網絡不穩定…

React 多語言國際化:實現多語言支持

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

Claude系列模型-20250426

文章目錄 Claude 3.7 Sonnet - "Our most intelligent model yet"Claude 3.5 Haiku - "Fastest model for daily tasks"Claude 3.5 Sonnet (Oct 2024)Claude 3 Opus總結Claude 3.7 Sonnet - “Our most intelligent model yet” 特點: 這是目前Claude系列…

Linux查看可用端口號碼命令

在Linux系統中&#xff0c;有多種命令可用于查看可用端口號碼&#xff0c;下面為你詳細介紹&#xff1a; 1. 使用netstat命令 netstat是一個功能強大的網絡工具&#xff0c;可用于顯示網絡連接、路由表和網絡接口等信息。你可以結合不同的選項來查看端口使用情況。 查看所有…

leetcode201.數字范圍按位與

找到公共前綴部分&#xff0c;然后后面的部分全0 class Solution {public int rangeBitwiseAnd(int left, int right) {int offset 0;while (left ! right) {offset;left left >> 1;right right >> 1;}return right << offset;} }

端到端自動駕駛的數據規模化定律

25年4月來自Nvidia、多倫多大學、NYU和斯坦福大學的論文“Data Scaling Laws for End-to-End Autonomous Driving”。 自動駕駛汽車 (AV) 棧傳統上依賴于分解方法&#xff0c;使用單獨的模塊處理感知、預測和規劃。然而&#xff0c;這種設計在模塊間通信期間會引入信息丟失&am…

021-C語言文件操作

C語言文件操作 文章目錄 C語言文件操作1. 文件的概念2. 二進制文件和文本文件3. 文件的打開和關閉3.1 流和標準流3.1.1 流3.1.2 標準流 3.2 文件指針3.3 文件的打開和關閉 4. 文件的順序讀寫4.1 順序讀寫函數4.2 對比兩組函數4.2.1 scanf/fscanf/sscanf4.2.2 printf/fprintf/sp…

如何使用@KafkaListener實現從nacos中動態獲取監聽的topic

1、簡介 對于經常需要變更kafka主題的場景&#xff0c;為了實現動態監聽topic的功能&#xff0c;可以使用以下方式。 2、使用步驟 2.1、添加依賴 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactI…

《TCP/IP詳解 卷1:協議》之第七、八章:Ping Traceroute

目錄 一、ICMP回顯請求和回顯應答 1、ICMP回顯請求 2、ICMP回顯應答 二、ARP高速緩存 三、IP記錄路由選項&#xff08;Record Route&#xff0c;RR&#xff09; 1、記錄路由選項的工作過程 2、RR 選項的 IP 頭部格式 2.1、RR 請求 2.2、RR響應 四、ping 的去返路徑 五…

30天通過軟考高項-第四天

30天通過軟考高項-第四天 任務&#xff1a;項目進度管理 思維導圖閱讀 知識點集錦閱讀 知識點記憶 章節習題練習 知識點練習 手寫回憶ITTO 聽一遍喜馬拉雅關于范圍的內容 進度管理-背 1. 過程定義 龜腚排池至控 規劃進度管理&#xff1a;為了規劃、編制、管理…

根據JSON動態生成表單表格

根據JSON動態生成表單表格 一. 子組件 DynamicFormTable.vue1,根據JSON數據動態生成表單表格,支持表單驗證JS部分1.1,props數據1.2,表單數據和數據監聽1.3,自動驗證1.4,表單驗證1.5,獲取表單數據1.6,事件處理1.7,暴露方法給父組件2,HTML部分二,父組件1, 模擬數據2,…

【趙渝強老師】快速上手TiDB數據庫

從TiDBv4.0起&#xff0c;提供了包管理工具TiUP&#xff0c;負責管理TiDB、PD、TiKV等組件。用戶只需通過TiUP命令即可運行這些組件&#xff0c;顯著降低了管理難度。TiUP程序只包含少數幾個命令&#xff0c;用來下載、更新、卸載組件。TiUP通過各種組件來擴展其功能。組件是一…