日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UML类图五种关系与代码的对应关系

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UML类图五种关系与代码的对应关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UML類圖中的五種關系的耦合強弱比較:依賴<關聯<聚合<組合<繼承

一、依賴關系:

(一)說明

虛線+箭頭

可描述為:Uses a

依賴是類的五種關系中耦合最小的一種關系。

因為在生成代碼的時候,這兩個關系類都不會增加屬性

(二)依賴關系圖與代碼的對應關系


PS:依賴關系:Animal依賴于Water(動物依賴于水))

[csharp]?view plaincopyprint?
  • Public?class?Animal()??
  • {??
  • ????????Public?Animal(){}??
  • }??
  • ??
  • Public?class?Water()??
  • {??
  • ????????public?Water(){}??
  • }??
  • ? ? ? ? ? 可以看到生成的兩個類的代碼中什么都沒有添加

    (三)思考:

    Animal類如何使用Water類呢?或者說依賴關系到底是如何體現的呢?

    1、表現形式1

    Water類是全局的,則Animal類可以調用它

    2、表現形式2

    Water類是?Animal類的某個方法中的變量,則Animal類可以調用它。

    [csharp]?view plaincopyprint?
  • Public?class?Animal?{??
  • ??????Public?void?Grownup()?{??
  • ???????????????Water?water?=null;??
  • ??????}??
  • }??
  • 注意1?Water類的生命期,它是Animal類的GrounUp方法被調用的時候,才被實例化

    注意2持有Water類的是Animal的一個方法而不是Animal,這點是最重要的!

    3、表現形式3

    Water類是作為Animal類中某個方法的參數或者返回值?

    [csharp]?view plaincopyprint?
  • Public?Animal?{??
  • ???Public?Water?Grownup(Waterwater)?{??
  • ??????????????return?null;??
  • ??????}??
  • }??

  • 注意: ? Water類被Animal類的一個方法持有。生命期隨著方法的執行結束而結束

    ?

    二、關聯關系

    (一)說明

    實線+箭頭

    可描述為:Has a

    關聯關系用實線,表示類之間的耦合度比依賴強

    在生成代碼的時候,關聯關系的類會增加屬性。

    (二)關聯關系與代碼的對應關系

    ? ? ??

    ? ? ? ? ? ?PS:Water類與Climate類關聯(水與氣候關聯)。?

    [csharp]?view plaincopyprint?
  • Public?classWater?{??
  • ?????public?Climate?m_Climate;??
  • ?????public?Water(){}??
  • }??
  • ???
  • Public?class?Climate?{??
  • ?????public?Climate()?{}??
  • }??
  • 可見生成的代碼中,Water類的屬性中增加了Climate類。

    (三)關聯關系的種類

    關聯既有單向關聯又有雙向關聯。

    1、單向關聯:?Water類和Climate類單向關聯(如下圖),則Water類稱為源類,Climate類稱為目標類。源類了解目標類的所有的屬性和方法,但目標類并不了解源類的信息。

    ???? ? ?

    2、雙向關聯:源類和目標類相互了解彼此的信息。如將Water類和Climate類之間改為雙向關聯。


    [csharp]?view plaincopyprint?
  • Public?class?Water?{??
  • ????public?Climate?m_Climate;??
  • ????public?Water(){}??
  • }??
  • Public?class?Climate?{??
  • ????public?Water?m_Water;??
  • ????public?Climate()?{}??
  • }??

  • 可見生成的代碼中,兩個類的屬性都添加了!


    (四)思考:

    依賴關系和關聯關系的區別在哪里?

    1、從類的屬性是否增加的角度看

    ??1)發生依賴關系的兩個類都不會增加屬性。其中的一個類作為另一個類的方法的參數或者返回值,或者是某個方法的變量而已。

    ??2)發生關聯關系的兩個類,其中的一個類成為另一個類的屬性,而屬性是一種更為緊密的耦合,更為長久的持有關系。

    2、從關系的生命期角度看:

    ??1)依賴關系是僅當類的方法被調用時而產生,伴隨著方法的結束而結束了。

    ??2)關聯關系是當類實例化的時候即產生,當類銷毀的時候,關系結束。相比依賴講,關聯關系的生存期更長。

    (五)關聯關系的細化:聚合、組合

    1、說明

    1)聚合關系,用空心菱形加箭頭表示

    2)組合關系,用實心菱形加箭頭表示,類之間的耦合關系比聚合強!

    2聚合和組合都是關聯關系的一種,到底如何區分二者呢?

    1)聚合和組合生成的代碼


    ? ? ? ? ?(PS:此圖表明雁群類是由大雁類聚合而成)

    [csharp]?view plaincopyprint?
  • Public?classGooseGroup?{??
  • ????public?Goose?goose;??
  • ????Public?GooseGroup(Goose?goose)?{??
  • ??????????????this.goose?=?goose;??
  • ???????}??
  • }??
  • ? ??

    ? ? ? ? (PS:此圖表明大雁類是由翅膀類組合而成)

    [csharp]?view plaincopyprint?
  • Public?classGoose?{??
  • ???public?Wings?wings;??
  • ???public?Goose()?{??
  • ???????wings?=?new?Wings();??
  • ????}??
  • }??
  • 2構造函數不同

    ? ? ? ? ??聚合類的構造函數中包含了另一個類作為參數。?雁群類(GooseGroup)的構?造函數中要用到大雁(Goose)作為參數傳遞進來。大雁類(Goose)可以脫離雁群類而獨立存在。

    ? ? ? ? ?組合類的構造函數中包含了另一個類的實例化。?表明大雁類在實例化之前,一定要先實例化翅膀類(Wings),這兩個類緊密的耦合在一起,同生共滅。翅膀類(Wings)是不可以脫離大雁類(Goose)而獨立存在。

    3信息的封裝性不同。

    ? ? ? ? ?在聚合關系中,客戶端可以同時了解雁群類和大雁類,因為他們都是獨立的。

    ? ? ? ? ?在組合關系中,客戶端只認識大雁類,根本就不知道翅膀類的存在,因為翅膀類被嚴密的封裝在大雁類中。

    ?

    三、泛化

    (一)說明

    實線+箭頭

    可描述為:Is a

    泛化也稱繼承,子類將繼承父類的所有屬性和方法,并且可以根據需要對父類進行拓展。

    (二)泛化關系與代碼的對應關系


    PSBird類繼承Animal類,鳥是一種動物)

    [csharp]?view plaincopyprint?
  • Class??Bird?:Animal{??
  • }??
  • (三)思考:

    1子類繼承父類,真的是繼承了父類的所有屬性和方法嗎?

    ? ? ??子類確實是繼承了父類的所有屬性和方法,只是對于父類的私有類型成員沒有訪問權限!訪問就會報錯!

    2泛化和繼承是一回事兒嗎?

    ??????子類繼承父類,父類泛化子類。?這兩個詞是從不同的角度來說的!?

    3為什么要多用組合少用繼承?

    ? ? ? ?繼承和組合各?有優缺點。

    ? ? ? ?類繼承是在編譯時刻靜態定義的,且可直接使用,類繼承可以較方便地改變父類的實現。但是類繼承也有一些不足之處。首先,因為繼承在編譯時刻就定義了,所以無法在運行時刻改變從父類繼承的實現。更糟的是,父類通常至少定義了子類的部分行為,父類的任何改變都可能影響子類的行為。如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關系限制了靈活性并最終限制了復用性。

    ? ? ? ??對象組合是通過獲得對其他對象的引用而在運行時刻動態定義的。由于組合要求對象具有良好定義的接口,而且,對象只能通過接口訪問,所以我們并不破壞封裝性;只要類型一致,運行時刻還可以用一個對象來替代另一個對象;更進一步,因為對象的實現是基于接口寫的,所以實現上存在較少的依賴關系。

    ?

    四、實現關系

    ? ? ? ?虛線+箭頭


    ?????(PSWideGoose類實現IFly接口。大雁實現飛翔的接口)

    [csharp]?view plaincopyprint?
  • Class?WideGoose:Ifly{???
  • }??
  • 實現關系重點理解接口的定義

    ????接口interface),接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實現。

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的UML类图五种关系与代码的对应关系的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。