2012-07-13 3 views
5

を階層:UMLクラス図組成物は、私がやった方法で、以下の2つのクラス階層間の関係をモデル化することができる場合、私は思っていた

car-engine composition relationship

の意味を表すことになり、コードこれはのようになります。

public abstract class Car 
{ 
    protected Engine engine; 
} 
public class StreetCar extends Car 
{ 
    public StreetCar() 
    { 
      engine = new StreetEngine(); 
    } 
} 

...と同様にクラスOffroadCarのために、それはengine = new OffroadEngine()ような何かをするだろう。私はaccelerate()メソッドについて何も記述していませんが、それは関係ありません。

私は、構図が正しくモデル化されているか、それとも冗長であるか、その多くの構図の矢印を追加することが間違っているかどうかを知りたいだけです。

+0

これは宿題のようなにおいをします。そうであれば、そのようにマークしてください。 – Jochen

+0

いいえ、宿題ではありません:P – annouk

答えて

3

質問の前に、これは、異なる種類の図のように、階層関係を構成関係から分割することをお勧めします。

注:混乱を避けるため、ダイアグラムにEngineを「protected」および「Class」プレフィックスとして追加しました。

(1)の組成図

"CarClass" のオブジェクト、その "EngineClass" の1つのオブジェクトによって構成される。

.............................................................................. 
..+-------------------------------------+........+-------------------------+.. 
..|   <<abstract>>    |........|  <<abstract>>  |.. 
..|    CarClass    |........|  EngineClass  |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [#] Engine: EngineClass    |<*>-----+ [+] startEngine(): void |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [+] acelerate(): void <<virtual>> |..................................... 
..+-------------------------------------+..................................... 
.............................................................................. 

(2.1)継承図

"CarClass" の目的は、特定のシナリオの際に、子クラスを有していてもよいです。

........................................... 
..+-------------------------------------+.. 
..|   <<abstract>>    |.. 
..|    CarClass    |.. 
..+-------------------------------------+.. 
..| [#] Engine: EngineClass    |.. 
..+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |.. 
..+-----------------+-------------------+.. 
.................../.\..................... 
................../...\.................... 
.................+--+--+.............................................................. 
....................|................................................................. 
....................+------------------------------------------+...................... 
....................|..........................................|...................... 
..+-----------------+-------------------+....+-----------------+-------------------+.. 
..|   <<concrete>>    |....|   <<concrete>>    |.. 
..|   StreetCarClass   |....|   OffRoadCarClass   |.. 
..+-------------------------------------+....+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |....| [+] acelerate(): void <<override>> |.. 
..+-------------------------------------+....+-------------------------------------+.. 
...................................................................................... 

(2.2)継承図

"EngineClass" の目的は、特定のシナリオの際に、子クラスを有していてもよいです。

........................................... 
..+-------------------------------------+.. 
..|   <<abstract>>    |.. 
..|    EngineClass    |.. 
..+-------------------------------------+.. 
..| [+] acelerate(): void <<override>> |.. 
..+-----------------+-------------------+.. 
.................../.\..................... 
................../...\.................... 
.................+--+--+.............................................................. 
....................+------------------------------------------+...................... 
....................|..........................................|...................... 
....................|..........................................|...................... 
..+-----------------+-------------------+....+-----------------+-------------------+.. 
..|   <<concrete>>    |....|   <<concrete>>    |.. 
..|   StreetEngineClass   |....|   OffRoadEngineClass   |.. 
..+-------------------------------------+....+-------------------------------------+.. 
..| [+] startEngine(): void <<override>>|....| [+] startEngine(): void<<override>> |.. 
..+-------------------------------------+....+-------------------------------------+.. 
...................................................................................... 

3回答

次に、このクラスは、メンバーを構成unleastいずれかを有し、メインクラスがオーバーライドされたときに、その型は、オーバーライドすることができる場合、です。これは、「パラレル階層ソフトウェアパターン」または「デュアル階層ソフトウェアパターン」と呼ばれることがあります。

メインクラスごとに2つのサブクラスしか記述されていませんが、実際にはもっと多くのサブクラスが存在する可能性があります。

通常、私はこのようなグラフを2つ作成します。 1つは、私は、この場合を示すコメントを追加する最初の図を作成します。

3.1メインParalell階層図

.............................................................................. 
..+-------------------------------------+........+-------------------------+.. 
..|   <<abstract>>    |........|  <<abstract>>  |.. 
..|    CarClass    |........|  EngineClass  |.. 
..+-------------------------------------+........+-------------------------+.. 
..| [#] Engine: EngineClass    |<*>-----+ [+] startEngine(): void |.. 
..+-------------------------------------+........+------------+------------+.. 
..| [+] acelerate(): void <<virtual>> |.....................|............... 
..+--------------+----------------------+.....................|............... 
.................|............................................|............... 
.................+--------------------------------------------+............... 
.................|............................................................ 
........+--------+-------+.................................................... 
........| Note:  |.................................................... 
........| Paralell  /.................................................... 
........| Hierarchy /| ................................................... 
........|   /|.................................................... 
........+-------------/--+.................................................... 
.............................................................................. 

後者の場合、両方のクラスの両方がメンバーを追加し、子クラスがあり、そのとき。

3。2追加Paralell階層図

.............................................................................. 
..+---------------------------------------+........+-------------------------+.. 
..|    <<concrete>>    |........|  <<concrete>>  |.. 
..|   OffRoadCarClass   |........| OffRoadEngineClass |.. 
..+---------------------------------------+........+-------------------------+.. 
..| [+] createEngine(): void <<override>> |<*>-----+ [+] startEngine(): void |.. 
..+---------------------------------------+........| [+] nitroLevel(): void |.. 
..| [+] useNitro(): void     |........+------------+------------+.. 
..| [+] acelerate(): void <<override>> |.....................|............... 
..+--------------+------------------------+.....................|............... 
.................|..............................................|............... 
.................+----------------------------------------------+............... 
.................|............................................................ 
........+--------+-------+.................................................... 
........| Note:  |.................................................... 
........| Paralell  /.................................................... 
........| Hierarchy /| ................................................... 
........|   /|.................................................... 
........+-------------/--+.................................................... 
.............................................................................. 

necesarilly場合、私は、追加のダイアグラムを追加することができます。

4は、通常、そのはオーバーライドメソッドによって管理される複合メンバーの作成を、この「平行」の階層を管理するために、ために私のコード

を表示します。

public abstract class EngineClass 
{ 
    public void startEngine() { ... } 
} // EngineClass 

public abstract class CarClass 
{ 
    protected EngineClass engine; 

    public CarClass() 
    { 
     // ... 
    } 

    public EngineClass createEngine() 
    { 
     EngineClass Result = new EngineClass(); 
     return Result; 
    } 

    public void start() 
    { 
     this.Engine = createEngine(); 
    } 
} // CarClass 

public class StreetCarClass extends CarClass 
{ 
    public StreetCarClass() 
    { 
     // ... 
    } 

    @override 
    public EngineClass createEngine() 
    { 
     EngineClass Result = new StreetCarEngineClass(); 
     return Result; 
    } 
} // StreetCarClass 

public class OffRoadCarClass extends CarClass 
{ 
    public OffRoadCarClass() 
    { 
     // ... 
    } 

    @override 
    public EngineClass createEngine() 
    { 
     EngineClass Result = new OffRoadCarEngineClass(); 
     return Result; 
    } 
} // OffRoadCarClass 

public class ExampleClass 
{ 
    public static main() 
    { 
     EngineClass OffRoadCar = new OffRoadCarClass(); 
     OffRoadCar.start(); 
    } 
} // OffRoadCarClass 

乾杯。

P.S.私は、ウル、ハッハッハ、魚の釣り人ですか?

+1

これらの図を生成するために何を使用しましたか? – Marvo

+3

@Marvo:このツールはhttp://www.asciiflow.com/#Drawですが、手作業でコードを書いています – umlcat

+0

このトピックを徹底的に網羅していただきありがとうございます。しかし、私は何かをよく理解していません。私は1つ以上の大きなダイアグラムを行うことはできません。上記の私のダイアグラムが正しいことを理解し、 "並列階層"コメントを追加するだけでいいですか? – annouk

関連する問題