華南理工大學UML-6類圖中一些高級屬性_第1頁
華南理工大學UML-6類圖中一些高級屬性_第2頁
華南理工大學UML-6類圖中一些高級屬性_第3頁
華南理工大學UML-6類圖中一些高級屬性_第4頁
華南理工大學UML-6類圖中一些高級屬性_第5頁
已閱讀5頁,還剩57頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

軟件需求分析與建模

-補充:接口、抽象類和各種關聯姓名:蘇錦鈿(

SuJD@)單位:計算機科學與工程學院時間:2024年1月4日1補充:接口、抽象類和各種關聯2抽象類抽象類是指那些不具有任何對象的類,其作用是為其他的類描述它們的公共屬性和行為。(例如Vehicle)通常,抽象類具有一組抽象操作。一個擁有至少一個抽象操作的類必定是一個抽象類。UML采用斜體表示抽象元素的名稱;如果不用斜體字,也可使用{abstract}約束來表示。華南理工大學3面向對象分析與設計接口一個類和一個接口不同:一個類可以有它形態的真實實例,然而一個接口必須至少有一個類來實現它。在UML2中,一個接口被認為是類建模元素的特殊化。因此,接口就象類那樣繪制,但是長方形的頂部區域也有文本“interface”,如下圖所示。

華南理工大學4面向對象分析與設計常量接口接口一般用來表示一組行為,但有時候也會用來表示靜態數據,稱為常量接口。Java語言中的ObjectStreamConstants、Zipconstants和DnDConstants就是常量接口。(不建議使用這種方法)華南理工大學5面向對象分析與設計Java語言中的標識接口標識接口是指沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語義上的要求,僅表明實現它的類有一個特定的類型。比如Java語言中的java.io.Serializable和java.rmi.Remote等。華南理工大學6面向對象分析與設計VI接口和抽象類接口是一個不帶實現的類,它只規定類的外部特性,包括公共屬性、操作及其語義,因此只有操作聲明而沒有方法體和物理存儲區。抽象類和接口很相似,也只定義接口而推遲定義其實現部分,然而抽象類允許增加一些方法的實現。華南理工大學7面向對象分析與設計接口和抽象類(續)依賴文本編輯器

toFront()toBack()abstract

窗口Mac窗口toFront()toBack()Windows窗口toFront()toBack()抽象類允許增加一些方法的實現,但接口必須推遲定義所有的方法。華南理工大學8面向對象分析與設計接口和抽象類的主要區別抽象類是一種類是對一組具有相同屬性和方法的邏輯上有關系的事物的一種抽象。而接口則是對一組具有相同屬性和方法的邏輯上不相關的事物的一種抽象。abstractclass和interface是Java語言中對于抽象類定義進行支持的兩種機制,正是由于這兩種機制的存在,才賦予了Java強大的面向對象能力。華南理工大學9面向對象分析與設計abstractclass和interface之間在對于抽象類定義的支持方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對于abstractclass和interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區別的,對于它們的選擇甚至反映出對于問題領域本質的理解、對于設計意圖的理解是否正確、合理。

華南理工大學10面向對象分析與設計abstractclass和interface在Java語言中都是用來進行抽象類定義的,那么什么是抽象類,使用抽象類能為我們帶來什么好處呢?

在面向對象技術中,所有的對象都是通過類來描繪的,但是反過來卻不是這樣。并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表征我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。華南理工大學11面向對象分析與設計比如:如果我們進行一個圖形編輯軟件的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能夠實例化的。

華南理工大學12面向對象分析與設計語法層面的區別在語法層面,Java語言對于abstract

class和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。

使用abstract

class的方式定義Demo抽象類的方式如下:

abstract

class

Demo

abstract

void

method1();

abstract

void

method2();

華南理工大學13面向對象分析與設計使用interface的方式定義Demo抽象類的方式如下:

interface

Demo

{

void

method1();

void

method2();

}

華南理工大學14面向對象分析與設計在abstract

class方式中,Demo可以有自己的數據成員,也可以有非abstarct的成員方法。而在interface方式的實現中,Demo只能夠有靜態的不能被修改的數據成員(也就是必須是finalstatic的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstract

class。

從編程的角度來看,abstract

class和interface都可以用來實現"design

by

contract"的思想。但是在具體的使用上面還是有一些區別的。華南理工大學15面向對象分析與設計首先,abstract

class在Java語言中表示的是一種繼承關系,一個類只能使用一次繼承關系。但是,一個類卻可以實現多個interface。也許,這是Java語言的設計者在考慮Java對于多重繼承的支持方面的一種折中考慮吧。

其次,在abstract

class的定義中,我們可以賦予方法的默認行為。但是在interface的定義中,方法卻不能擁有默認行為,為了繞過這個限制,必須使用委托,但是這會

增加一些復雜性,有時會造成很大的麻煩。華南理工大學16面向對象分析與設計設計理念層面上的區別abstract

class在Java語言中體現了一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在“is

a”關系,即父類和派生類在概念本質上應該是相同的。對于interface

來說則不然,并不要求interface的實現者和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約而已。華南理工大學17面向對象分析與設計實例假設在我們的問題領域中有一個關于Door的抽象概念,該Door具有執行兩個動作open和close,此時我們可以通過abstract

class或者interface來定義一個表示該抽象概念的類型,定義方式分別如下所示:

使用abstract

class方式定義Door:

abstract

class

Door

{

abstract

void

open();

abstract

void

close();

}

華南理工大學18面向對象分析與設計使用interface方式定義Door:

interface

Door

{

void

open();

void

close();

}

華南理工大學19面向對象分析與設計其他具體的Door類型可以extends使用abstract

class方式定義的Door或者implements使用interface方式定義的Door??雌饋砗孟袷褂胊bstract

class和interface沒有大的區別。如果現在要求Door還要具有報警的功能。我們該如何設計針對該例子的類結構呢?華南理工大學20面向對象分析與設計解決方案一:

簡單的在Door的定義中增加一個alarm方法,如下:

abstract

class

Door

{

abstract

void

open();

abstract

void

close();

abstract

void

alarm();

}

華南理工大學21面向對象分析與設計或者:

interface

Door

{

void

open();

void

close();

void

alarm();

}

華南理工大學22面向對象分析與設計那么具有報警功能的AlarmDoor的定義方式如下:

class

AlarmDoor

extends

Door

{

void

open()

{

}

void

close()

{

}

void

alarm()

{

}

}

或者

class

AlarmDoor

implements

Door

void

open()

{

}

void

close()

{

}

void

alarm()

{

}

華南理工大學23面向對象分析與設計解決方案二:

既然open、close和alarm屬于兩個不同的概念,根據ISP原則應該把它們分別定義在代表這兩個概念的抽象類中。定義方式有:(1)這兩個概念都使用abstract

class方式定義;(2)兩個概念都使用interface方式定義;(3)一個概念使用abstract

class方式定義,另一個概念使用interface方式定義。

華南理工大學24面向對象分析與設計AlarmDoor在概念本質上是Door,同時它有具有報警的功能。因此,對于Door這個概念,我們應該使用abstarct

class方式來定義。另外,AlarmDoor又具有報警功能,說明它又能夠完成報警概念中定義的行為,所以報警概念可以通過interface方式定義。華南理工大學25面向對象分析與設計如下所示:

abstract

class

Door

{

abstract

void

open();

abstract

void

close();

}

interface

Alarm

{

void

alarm();

}

class

AlarmDoor

extends

Door

implements

Alarm

{

void

open()

{

}

void

close()

{

}

void

alarm()

{

}

}

華南理工大學26面向對象分析與設計您是否碰到過以下問題:1、接口不實現方法,但在程序中可以調用接口的方法,這是為什么?比如java.sql

包中的Connection、Statement、ResultSet

等都是接口,怎么可以調用它們的方法呢?

2、抽象類不能實例化,但是jdk中卻有很多抽象類的對象,這是為什么?比如System.in

是一個InputStream

類型對象,但InputStream

是抽象類,怎么可以得到它的對象呢?華南理工大學27面向對象分析與設計不管是抽象類中的抽象方法,還是接口中定義的方法,都是需要被調用的,否則這些方法定義出來就沒有意義了。要注意:

一個子類如果繼承了它的基類,則表示這個類也是其基類的一種類型,這個子類的一個對象是子類類型,并且同時也是其基類的一個對象,它也具有基其類的類型;一個類如果實現了一個接口,則表示這個類的一個對象也是這個接口的一個對象。華南理工大學28面向對象分析與設計例如:

如果“人”是一個基類,則“男人”是“人”的一個子類。如果“張三”是一個“男人”,也就是說“張三”是“男人”的一個對象,那么顯然“張三”也是“人”這個基類的一個對象。同樣的,如果“客戶”是一個基類,“VIP客戶”是“客戶”的一個子類。如果“李四”是VIP客戶,那么它也是客戶的一個對象。華南理工大學29面向對象分析與設計因此,我們得到的抽象類的對象其實是它的已經實現了抽象方法的子類或子孫類的一個對象,但我們拿它當它的抽象類的基類來用。例如jdk

的抽象類java.lang.Process

Runtimeruntime=Rumtime.getRuntime();

Processprocess=rumtime.exec("notepad.exe");

Classcls=process.getClass();

System.out.println(cls.getName());

華南理工大學30面向對象分析與設計這時會打印出process類的名字,如果在Windows下它會是一個類似于*Win32*的名字,它是Process的一個子類。因為process類用于管理打開的進程,而在不同的操作系統上都有不同的實現,因此它把方法定義為Process的抽象方法,而具體的操作只能由對應在不同操作系統下的子實現。華南理工大學31面向對象分析與設計對接口來說,其原理也是一樣接口是一個規范,規定了實現接口的類必須具備的能力(也就是方法)。例如,某種類型的駕駛執照,要拿到這個駕照的人必須能夠“開小汽車”和“開公共汽車”。那么可認為這個駕照是一個接口??啥x類Driver,繼承自Human,然后實現“駕照持有者”這個接口:

publicinterfaceDriverHolder{

publicvoiddriverCar();

publicvoiddriverBus();

}

publicclassDriverextendsHumanimplementsDriverHolder{

publicvoiddriverCar(){

//......

}

publicvoiddriverBus(){

//......

}

}華南理工大學32面向對象分析與設計這樣一來,一個“Driver”對象,它同時也是一個DrivreHolder

對象。即一個司機(Driver)同時是一個駕照執持有者對象。在程序中我們可以這樣:

DriverHolder

driverholder=newDriver();

driverholder.driverCar();華南理工大學33面向對象分析與設計為什么要定義一個接口呢?為什么不直接把這個方法定義到Driver類中去,然后Driverdriver=newDriver();一樣可以調用它的driverCar();和driverBus()方法,這樣做豈不是方便得多?華南理工大學34面向對象分析與設計下面我們看一看java的事件機制。

java.awt.Button

類有一個addActionListener(ActionListenerl);方法。該方法傳入的是接口類型:ActionListerner,在實際中,需要實現ActionListener

接口,并把實現這個接口的類的對象引用作為參數傳入。這樣,Button對象就得到了一個ActionListener

對象,它知道這個ActionListener

對象有一個actionPerformed

方法,或者說它有處理Action事件的能力,當Action事件發生時,它就可以調用這個對象的actionPerformed

方法。

華南理工大學35面向對象分析與設計比如一般我們會這樣做:

publicclassTestButtonextendsFrameimplementsActionListener{

privateButtonbtn1=newButton();

//......

publicTestButton(){

btn.addActionListener(this);

this.add(btn);

}

publicvoidactionPerformed(ActionEvente){

}

}華南理工大學36面向對象分析與設計假設ActionListener

不是接口,而是一個類。那會出現什么樣的情況?

華南理工大學37面向對象分析與設計那么我們只能繼承ActionListener

類,并且重寫actionPerformed

方法。但是java是單繼承的,如果類繼承了ActionListener

類,那么它就不能繼承其它的類(Frame類)了,而不從Frame類繼承的話,又怎么創建窗體,怎么把Button放到窗體中去呢?華南理工大學38面向對象分析與設計其實接口不完全是為了解決java的單繼承問題,它在某種程度上可以達到調用和實現細節的分離。

例如,在Button的事件機制中,Button要保證所有的action事件發生時,程序員都可以在代碼中處理它。而接口就可以做到這一點:找一個類實現ActionListener

接口,并讓Button得到該類的對象的引用(調用addActionListener

方法)。當Action事件發生時,button創建一個包含了事件信息的對象(ActionEvent),然后調用這個接口對象的方法。至于如何處理這次事件,這就是實現接口的類的事情了。在這里,Button絲毫不了解actionPerformed

方法中到底干了什么事情,也不應該知道。Button與具體的業務邏輯完全分離開了,它可以應用到所有的場合。華南理工大學39面向對象分析與設計在系統的設計過程中,頂層的元素是用接口好,還是用抽象類好呢?如果是用接口好的話,那么當接口中部分方法是實現該接口的類所不需要的,怎么辦呢?華南理工大學40面向對象分析與設計契約式編程先看下面一段代碼:publicclassRationalNumber

{privateint

numberator;privateintdenominator;publicRationalNumber(int

numberator,intdenominator){

this.numberator=numberator;

this.denominator=denominator;}}}上述代碼表示一個在32位有符號整型范圍內的有理數。華南理工大學41面向對象分析與設計有理數的分母不能為0。所以,上述代需要改為:publicclassRationalNumber{privateint

numberator;privateintdenominator;publicRationalNumber(int

numberator,intdenominator){if(denominator==0)thrownewArgumentException("Thesecondargumentcannotbezero.");this.numberator=numberator;this.denominator=denominator;}}華南理工大學42面向對象分析與設計使用契約式編程publicclassRationalNumber{privateint

numberator;privateintdenominator;publicRationalNumber(int

numberator,intdenominator){Contract.Requires(denominator!=0,"cannotbezero.");this.numberator=numberator;this.denominator=denominator;}publicintDenominator{get{Contract.Ensures(Contract.Result<int>()!=0);returnthis.denominator;}}[ContractInvariantMethod]protectedvoidObjectInvariant(){Contract.Invariant(this.denominator!=0);}}華南理工大學43面向對象分析與設計C++里面有沒有契約式編程思想?如果存在的話,你平時會經常使用嗎?華南理工大學44面向對象分析與設計是否碰到過下面類似的代碼:#ifdefCONTRACT_FULLASSERT(denominator!=0);CheckInvaraint(*this);#endif

this.numberator=numberator;this.denominator=denominator;#ifdefCONTRACT_FULL CheckInvaraint(*this);#endif}華南理工大學45面向對象分析與設計契約式編程不是一門嶄新的編程方法論。在C/C++時代已經存在。但并未應用廣泛,主要原因包括:1.C++中經常包括大量的宏和條件編譯,因此給代碼的可讀性等造成很多麻煩。2.契約式編程在C++世界并未被標準化,因此項目之間的定義和修改各不一樣,給代碼造成很大混亂。華南理工大學46面向對象分析與設計.NET4.0中正式引入契約式編程庫。實際上,.NET4.0僅僅是針對C++宏和條件編譯的再次抽象和封裝。它完全基于CONTRACTS_FULL,CONTRACTS_PRECONDITIONSSymbol和System.Diagnostics.Debug.Assert

方法、System.Environment.FastFail

方法的封裝。華南理工大學47面向對象分析與設計契約式編程契約是減少大型項目成本的突破性技術。它一般由Precondition(前置條件),Postcondition(后置條件)和Invariant(不變量)

等概念組成。.NET4.0除上述概念之外,還增加了Assert(斷言),Assume(假設)概念。契約的思想很簡單。它只是一組結果為真的表達式。如若不然,契約就被違反。那按照定義,程序中就存在紕漏。契約構成了程序規格說明的一部分。將契約挪移到代碼中,就使得程序可以被驗證。華南理工大學48面向對象分析與設計契約式編程Design

by

ContractDesign

by

Contract(DBC)大概可以譯為“按契約設計”,是由Bertrand

Meyer首先正式提出并在Eiffel語言中實現的編程方法學。

有兩個敵對的學派,分別叫做: (1)Defensive

Programming(創始人Barbara

Liskov)(2)Design

by

Contract(創始人Bertrand

Meyer)

前者認為在每一個函數中需要加入盡可能多的條件檢查,以確保這個函數是正常工作的。后者認為,需要為每一個函數精確指明調用者(Client

客戶端)需要滿足的條件,以及函數的實現本身(Contractor

)需要滿足的條件,就可以了。

華南理工大學49面向對象分析與設計契約式設計契約式設計(DesignbyContract)(DBC)是面向對象的軟件設計中的一種技術,它的目的是保證軟件質量、可靠性和可重用性。DBC中的關鍵考慮是可以通過以下做法實現這個目標:(1)盡可能準確地規定組件之間的通信。(2)定義通信過程中的相互責任和預期的結果。這些相互責任稱為契約,用斷言檢查應用程序是否滿足契約。簡單地說,斷言是插入到程序執行中的特定點的布爾表達式,它必須為真。失敗的斷言通常是軟件bug的癥兆,所以必須將它報告給使用者。華南理工大學50面向對象分析與設計斷言和Java語言DBC識別三種基本的斷言類型:(1)前置條件:客戶為了正確調用外部組件而必須滿足的責任。(2)后置條件:執行外部組件后的預期結果。(3)不變量:在執行了外部組件后維持不變的條件。Java語言原來沒有提供對斷言的天然支持。assert語句是在版本1.4中加入的。華南理工大學51面向對象分析與設計契約式設計流程:華南理工大學52面向對象分析與設計其他的各種關聯 1.限定關聯2.關聯類3.雙向關聯4.單向關聯5.遞歸關聯華南理工

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論