2012-07-13 13 views
5

ich mich gefragt, ob ich unter die Beziehung zwischen den beiden Klassenhierarchien modelliert, in der Art und Weise, die ich getan habe:UML-Klassendiagramm Zusammensetzung mit Klassenhierarchien

car-engine composition relationship

Der Code, der die Bedeutung darstellen würde dies wäre so etwas wie sein:

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

... und in ähnlicher Weise für die Klasse OffroadCar, wäre es so etwas wie engine = new OffroadEngine() tun. Ich habe nichts über die Methode accelerate() aufgenommen, das ist nicht relevant.

Ich möchte nur wissen, ob die Komposition korrekt modelliert ist oder ob es überflüssig ist oder sogar falsch ist, so viele Kompositionspfeile hinzuzufügen.

+0

Das riecht nach Hausaufgaben. Wenn dies der Fall ist, markieren Sie sie bitte als solche. – Jochen

+0

Nein, es sind keine Hausaufgaben: P – annouk

Antwort

3

Vor der Antwort Frage, dies ist einer dieser Fälle, wo ist es eine gute Idee, Hierarchie Beziehungen von Komposition Beziehungen, als ob sie wo verschiedene Arten von Diagrammen.

Hinweis: Ich habe Engine dem Diagramm als "geschützt" und "Klasse" hinzugefügt, um Verwirrung zu vermeiden.

(1) Zusammensetzungsdiagramm

Ein Ziel "CarClass" its bestehend aus 1 einzelnes Objekt von "EngineClass".

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

(2,1) Vererbungsschema

die Aufgabe "CarClass" haben Kind-Klassen können auf bestimmten Szenario.

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

(2,2) Vererbungsschema

die Aufgabe "EngineClass" haben Kind-Klassen können auf bestimmten Szenario.

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

3 Antwort

Nun, dies ist ein Fall, wo eine Klasse ein unleast eines Komponieren Mitglied hat, und seine Art außer Kraft gesetzt werden kann, wenn die Hauptklasse ihrer überschriebenen. Dies wird manchmal als "Paralell-Hierarchie-Software-Muster" oder "Doppel-Hierarchie-Software-Muster" bezeichnet.

Sie haben nur zwei Unterklassen von jeder Hauptklasse erwähnt, aber in Wirklichkeit könnte es mehr geben.

Normalerweise mache ich Diagramme wie diese 2 Wege. Eins, ich mache das erste Diagramm, indem ich einen Kommentar hinzufüge, der anzeigt, dass es sich um diesen Fall handelt.

3.1 Haupt Paralell Hierarchy Diagram

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

Der zweite Fall, sein, wenn beiden Klassen Kind Klassen haben, die beiden Mitglieder hinzufügen.

3.2 Zusätzliche Paralell Hierarchy Diagram

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

kann ich zusätzliche Diagramme hinzufügen, wenn necesarilly.

4 Zeigen Sie mir den Code

Um diese „parallel“ Hierarchien zu verwalten, in der Regel, es ist die Schaffung der Verbundelemente durch eine überschriebene Methode verwaltet.

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 

Prost.

P.S. Kann ich, ur, haz ein Fishburguer?

+1

Wofür haben Sie diese Diagramme erstellt? – Marvo

+3

@Marvo: dieses Tool, http://www.asciiflow.com/#Draw, aber ich habe von Hand einige Sachen codiert – umlcat

+0

Vielen Dank für Ihre Bemühungen, das Thema umfassend zu behandeln. Aber ich verstehe etwas nicht. Ich kann nicht mehr als ein großes Diagramm machen. Sollte ich verstehen, dass mein Diagramm oben korrekt ist und ich nur den Kommentar "Parallele Hierarchien" hinzufügen muss? – annouk