2010-08-29 56 views
1

我有一個Game類,並在該類中存在一個KeyInputHandler類。我相信這是一個「有」的關係,但我不是100%確定的。如果這確實是一個「有」的關係,它將是組成,我知道使用什麼符號,但如果它是別的東西,那麼我可以使用一些建議。我如何正確說明一個類與UML中的封閉類的關係?

編輯:

這是我關心的兩個類的結構。

//Import stuff 

public class Game extends Canvas { //The Game class 

    public Game(){ //Game constructor 

    } 

    //Other methods and stuff will go here 

    private class KeyInputHandler extends KeyAdapter { 
     //This is the only other class in my Game, and 
     //you can see it is enclosed in the Game class 
    } 

    public static void main(String[] args) { 
     Game game = new Game(); // Creates a new game 
    } 

} 
+0

+1這個問題 - 我認爲你是在與作曲組合。我認爲類本身在父類中的事實更多地與實現有關。但是這種關係非常複雜,海事組織。 – InSane 2010-08-29 04:09:04

+0

我會隨它而去......謝謝。 – ubiquibacon 2010-08-29 04:30:08

+0

我也想說,GameIn裏面的KeyInputHandler是偶然的,對「hasA」沒有多大改變。你並不是說Game有一個KeyInputHandler類型的字段,不是嗎? – ShiDoiSi 2010-08-29 08:57:13

回答

-1

從您的描述看,它看起來像一個合成關係。

  • 基數爲1:1(簡併案件1:許多)
  • 生命週期由類(KeyInputHandler)是由構成類(遊戲)

假設控制的那些是正確的,那麼組合物是適當。

一個值得提問的相關問題是如何描述它們之間的關係。 KeyInputHandler在遊戲中扮演什麼角色?這將有助於讀者理解關係的「原因」,而不僅僅是「什麼」。

+0

很抱歉,告訴你這個答案是錯誤的。兩個類之間的包含關係不涉及類本身。如果使用Game和KeyInputHandler之間的包含關係,則只需指定Game類的一個實例具有類型爲KeyInputHandler的屬性(它擁有KeyInputHandler的一個實例)。在這個問題中模擬的東西是完全不同的。它是Game類中定義的整個KeyInputHandler類。爲此,UML提供了一種叫做nestingClassifier的不同機制。看到我的答案 – Sindico 2013-02-23 08:25:42

+0

爲了更好地理解這一點,請看http://lowcoupling.com/post/47801917915/understanding-uml-associations – Sindico 2013-05-22 04:31:10

0

這裏的Game類就像頂層容器一樣,非常像我說的包。我猜KeyInputHandler是不是一個靜態類,並直接調用「回」到Game

在這種情況下,您可以直接使用KeyInputHandler類型的字段,也可以將實例傳遞給SWT等將回調它的環境。

因此,與@sfinnie建議的遏制型組合關聯將是合適的。然而,我認爲還有另一種可能的觀點:你也可以從組件角度來對待它。從這個角度來看,你的Game類成爲一個需要輸入環境的組件(SWT,鍵盤,...)。因此,在這個更加結構化的視圖中,您結合了Game,KeyInputHandler,並且例如SWT。

通常在軟件工程的組件世界中,這些正是那些具有穩定1:1關係的東西(穩定,因爲您將在整個生命週期中與同一個對象交談)。

也許你可以詳細說明KeyInputHandlerGame的耦合程度,也就是說,在Game以外的區域放置單獨的課程有多困難。這樣,你也可以從內部獲得它們的相關性(但是總是記住:「你不會需要它」,所以如果你的設計工作正常,那麼保留它 - 我們只是在這裏談論概念層面)。

0

我已經在您的UML工具中取消了您的java代碼並獲得了以下結果。 希望這個幫助!

alt text http://www.forum-omondo.com/inner_class_description.png

+0

Hummm,這是不同的。我從來沒有見過在UML的另一個類中實際繪製的類。 – ubiquibacon 2010-09-01 16:32:37

+0

您可以在其他類的內部或外部顯示該類,但結構類圖視圖應該是在另一個類內顯示的類。這是我使用的Java,但可能會與其他語言不同 – 2010-09-02 10:15:03

+0

@typoknig你從來沒有見過它,但它是類元類的nestedClassifier屬性的正確表示法,這是該規範所說的應該用來模擬內部類。查看我的回答 – Sindico 2013-02-26 10:37:56

0

UML規範2。5b1(最新版本)你可以在http://www.omg.org/spec/UML/2.5/Beta1/ 找到: 一個類充當在其作用域內定義的各種類別的命名空間,包括類。嵌套分類器是包含Class的名稱空間的成員。分類器嵌套用於信息隱藏的原因。嵌套分類器與包含類中的任何其他分類器一樣使用。 用於列出類中包含的類的類元類的屬性稱爲nestingClass,如圖11.15所示的元模型所示。 202

請注意(非常小心),兩個類之間的遏制關聯涉及他們的實例而不是類。