自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

經(jīng)驗總結(jié) 在UML類圖中表示Java繼承和接口

開發(fā) 架構(gòu)
UML建模中UML類圖有很多值得學(xué)習(xí)的地方,UML類圖的概念你是否熟悉,我們來看看如何在UML中表示兩個重要的Java概念——繼承,接口。

在上一篇文章中,我們引入了UML類圖的概念,比較了在Java編程語言和UML類圖中表示類、屬性、操作和關(guān)聯(lián)關(guān)系的不同之處。下面我們來看看如何在UML中表示兩個重要的Java概念——繼承,接口。

在UML類圖中表示Java繼承和接口

繼承

在Java中,我們可以聲明一個類擴展(extends)另一個類,還可以聲明一個類實現(xiàn)(implements)一個或者多個接口。下面我們來看看如何在UML中表達(dá)這些概念。
在上一篇文章中,我們引入了UML類圖的概念,比較了在Java編程語言和UML類圖中表示類、屬性、操作和關(guān)聯(lián)關(guān)系的不同之處。下面我們來看看如何在UML中表示兩個重要的Java概念——繼承,接口。
圖一用UML顯示了同樣的三個類。在操作和屬性聲明中,類型和參數(shù)之類的細(xì)節(jié)都沒有顯示出來,這是為了更清楚地顯示出類的整體結(jié)構(gòu)以及各個類之間的關(guān)系。


圖一:UML一般化關(guān)系


Java中的extends關(guān)鍵詞聲明了繼承關(guān)系,相當(dāng)于UML中的“一般化”(Generalization,也譯為“泛化”)關(guān)系,在UML圖形中用子類向超類的實線空心封閉箭頭表示。圖一額外增加了一個Sale類,這是為了更清楚地說明UML一般化關(guān)系與UML定向關(guān)聯(lián)關(guān)系所用箭頭的不同。關(guān)聯(lián)關(guān)系與一般化關(guān)系的另一個不同之處在于,一般化關(guān)系的兩端不需要說明多重性或角色名稱。
 

顯然,UML類圖比三個Java源代碼文件更清楚直觀地顯示出了三個類之間的繼承關(guān)系。如果你要與別人探討設(shè)計思路,繪制UML草圖也要比直接使用代碼簡單快捷得多。
也許有人會說,系統(tǒng)的類結(jié)構(gòu)圖就在他們的頭腦中,他們只需要直接使用Java代碼。實際上,對于規(guī)模較大的系統(tǒng),這種說法顯然是不成立的;即使對于規(guī)模較小的系統(tǒng),如果一定的時間之后要由其他程序員修改,沒有UML圖也會寸步難行——很難保證每一個人都了解你頭腦中的類結(jié)構(gòu)圖。

在UML中,抽象類的標(biāo)志是類的名字以斜體顯示。在白板或紙張上手工畫UML草圖時,很難區(qū)分字體是否是斜體。為此,一些人建議這些場合可以在類名稱的右下角加上{abstract}標(biāo)記以示區(qū)別。
另一些人認(rèn)為,在白板上寫{abstract}顯得太羅嗦,他們傾向于打破UML常規(guī),在類名稱的右下角加上一個0表示零個實例,如果在該位置寫上1,則表示該類是一個singleton類(永遠(yuǎn)只有一個實例的類);如果在該位置寫上N,則表示它是一個枚舉類(擁有固定實例數(shù)量的類,如一星期中的天數(shù),彩虹的顏色,等等)。不過,這一切都不是標(biāo)準(zhǔn)的UML,只能用于手工繪制UML圖的場合,看來也不可能得到UML建模工具的支持。

歷史知識:UML首先由Rational公司的一個工作組發(fā)明,Ration公司是UML建模工具Rose的生產(chǎn)者。UML于1995年的OOPSLA會議上被公諸于世,隨后,OMG(對象管理組織)于1997年采用了UML規(guī)范。不難理解,繼續(xù)負(fù)責(zé)發(fā)展UML規(guī)范的OMG任務(wù)組包含了來自幾乎所有主流UML工具廠商的代表。因此,除了嚴(yán)格遵從規(guī)范的UML軟件工具,在一些書籍或網(wǎng)頁上發(fā)現(xiàn)不規(guī)范的UML符號也不足為怪。

繼承使得一個類能夠使用另一個類的屬性和方法,就象使用自己的屬性和方法一樣。當(dāng)這類繼承機制第一次出現(xiàn)時,人們普遍把它視為重用現(xiàn)有代碼的理想方法。令人遺憾的是,規(guī)模過于龐大的繼承樹變得很脆弱,修改繼承樹的一部分,就會在整棵繼承樹中引起一系列的連帶反映。在面向?qū)ο蟮木幊讨校绻獙崿F(xiàn)有效的封裝,就應(yīng)該讓改動局部化,即一個地方的改動不至于引起其他地方的變化。而修改繼承樹一個地方引起其他地方的變化恰恰違背了上述設(shè)計思想。UML圖使得我們能夠方便地掌握繼承關(guān)系圖,從而為應(yīng)用繼承關(guān)系帶來了方便。那么,什么時候適合運用繼承關(guān)系呢?按照《JavaDesign》一書,對于超類A和子類B,執(zhí)行如下檢查:

◆命題“B是一個由A扮演的角色”不成立。

◆B永遠(yuǎn)不需要變形成為其他某些類別中的對象。

◆B擴展而不是覆蓋或廢棄A的行為。

◆A不僅僅是一個工具類(一些可以重用的實用功能)。

◆對于一個問題域(特定的業(yè)務(wù)對象環(huán)境):A和B定義了同一類型的對象,或者是用戶事務(wù)、角色、實體(團體、位置或其他東西),或其他物體的相似類別。

如果上述任意一個判斷不成立,那么把A和B定義成繼承關(guān)系可能是不合適的,改用關(guān)聯(lián)關(guān)系可能更加穩(wěn)固、正確。例如,圖二違背上面的第一個判斷,因為“雇員是一個由人扮演的角色”成立。另外,它還違背了第二個判斷,因為雇員確實可能改變其類別(身份),例如某個時候它可能是顧客。這樣,一個既是顧客又是雇員的人就要有兩個獨立的對象來描述,從而使保存在Person類里面的信息重復(fù)出現(xiàn),帶來了兩個數(shù)據(jù)副本之間數(shù)據(jù)不一致的風(fēng)險。#p#

接口

Java編程語言中接口(Interface)的概念也能夠與UML概念匹配。UML中的接口是一種實現(xiàn)繼承的形式,但這種繼承形式與Java中通過關(guān)鍵詞extends實現(xiàn)的繼承有所不同。

在Java中,extends關(guān)鍵詞描述了一種繼承形式,它既繼承接口也繼承行為。這種類型的繼承有時被稱為Sub-classing。與其他的面象對象編程語言不同,Java類只能從一個類繼承。許多時候,設(shè)計UML圖的人熟悉多種編程語言,常常會引入多重繼承的思想,例如C++的多重繼承思想。從已有的Java代碼生成UML圖(這個過程稱為反向工程)不會帶來多重繼承的問題,但如果要求一個Java程序員去實現(xiàn)一個帶有多重繼承的UML類圖,就會出現(xiàn)問題。如果多重繼承中的超類是純抽象類,這部分類可以用Java的接口來描述,但是,如果只做這種轉(zhuǎn)換不足以把UML類圖中的多重繼承全部轉(zhuǎn)換成單重繼承,這時就必須修改UML類圖重新建模了。

雖然Java不支持C++之類語言那樣的多重繼承,但它支持實現(xiàn)多重接口。這種由Java關(guān)鍵詞implements聲明的繼承只繼承接口,這種繼承有時被稱作Sub-typing。在UML中,實現(xiàn)接口的類與接口定義之間的關(guān)系叫做Realization關(guān)系,用一個虛線封閉箭頭表示,從實現(xiàn)接口的類指向接口。接口本身的UML圖與普通類一樣,但它的名字上面要加上“<<interface>>”。圖四由圖一修改而成,Payment類被一個接口取代。(關(guān)于Realization名稱的說明:Realization最常見的中文譯名是“實現(xiàn)”。但是,Java的implements也叫做“實現(xiàn)”。為避免混淆,本文中凡是出現(xiàn)Realization的地方一律直接使用英文)。

接口可以從一個或者多個其他接口擴展。UML一般化關(guān)系(實線封閉箭頭)可用來描述這種關(guān)系,如圖五所示。

UML還支持另一種接口符號,即用圓圈表示接口(加上連線之后就成了棒棒糖的樣子),但這種表示法多用于UML組件圖,在UML類圖中比較少見。

如果UML圖規(guī)模較大,有大量的類實現(xiàn)一個常用接口,整個UML圖可能亂成一團糟。《JavaDesign》一書提出了一種簡化方法,后來又被《StreamlinedObjectModeling》一書的作者采用,這就是在實現(xiàn)接口的類中,用接口的名字替代從接口繼承的方法,不過這不屬于標(biāo)準(zhǔn)方法。遺憾的是,目前似乎還沒有工具支持這種轉(zhuǎn)換。

結(jié)束語:

繼承和接口是Java語言中非常有用的機制,我們已經(jīng)看到,可以用UML的一般化和Realization關(guān)系使得Java的這兩個概念可視化。另外,一些非標(biāo)準(zhǔn)化的表示方法能夠極大地簡化UML圖。在下一篇文章中,我們將了解如何在Java程序中保留無法直接表達(dá)的UML語義信息。

【編輯推薦】

  1. 詳解八大UML類圖符號的表示法
  2. 全面認(rèn)識各種UML類圖符號
  3. UML類圖中四大關(guān)系詳解
  4. UML解惑:圖說六大UML類圖關(guān)系
  5. 學(xué)習(xí)筆記 解析UML類圖作用和使用方法

 

責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2010-06-18 15:15:13

UML

2010-07-08 10:33:34

UML接口

2010-06-12 17:37:18

UML實踐指南

2010-06-13 13:44:07

UML學(xué)習(xí)筆記

2010-06-30 16:17:41

UML建模優(yōu)點

2010-06-11 14:26:28

UML序列圖

2010-06-17 13:12:38

UML用例建模技巧

2015-09-30 14:40:47

WebAPI接口設(shè)計

2009-08-20 17:35:47

Servlet和JSP

2009-09-02 14:14:44

C# COM接口轉(zhuǎn)換

2010-07-08 16:14:14

UML組件圖

2009-10-15 09:27:00

2011-07-21 13:40:17

java

2010-06-13 15:18:02

UML實踐

2016-12-15 13:31:20

Java異常處理經(jīng)驗

2010-06-08 17:31:26

UML建模

2010-07-05 11:31:00

常用UML圖

2009-09-16 17:13:54

學(xué)習(xí)Linq

2009-08-27 11:21:36

C# override

2009-08-19 09:24:43

AJAX引擎經(jīng)驗總結(jié)
點贊
收藏

51CTO技術(shù)棧公眾號