5

私が行った方法で、以下の2つのクラス階層間の関係をモデル化できるかどうか疑問に思いました。

車とエンジンの構成関係

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

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

...そして同様にクラスOffroadCarの場合、それはのようなことをしますengine = new OffroadEngine()。私はaccelerated()メソッドについて何も含めていません。それは関係ありません。

コンポジションが正しくモデル化されているのか、それとも多くのコンポジション矢印を追加するのが冗長であるのか、それとも間違っているのかを知りたいだけです。

4

1 に答える 1

3

質問に答える前に、これはそれらのケースの1つであり、異なる種類の図があるかのように、階層関係を構成関係から分割することをお勧めします。

注:混乱を避けるために、「protected」および「Class」プレフィックスとしてエンジンを図に追加しました。

(1)構成図

「EngineClass」の1つのオブジェクトで構成される「CarClass」のオブジェクト。

..............................................................................
..+-------------------------------------+........+-------------------------+..
..|           <<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回答

さて、これは、クラスに少なくとも1つの構成メンバーがあり、メインクラスがオーバーライドされたときに、そのタイプがオーバーライドされる可能性がある場合です。これは、「ParalellHierarchySoftwarePattern」または「DualHierarchySoftwarePattern」と呼ばれることもあります。

各メインクラスのサブクラスについては2つしか言及していませんが、実際にはもっと多くのサブクラスがある可能性があります。

通常、私はこの2つの方法でチャートを作成します。1つは、この場合を示すコメントを追加して、最初の図を作成します。

3.1主な並列階層図

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

2番目のケースは、両方のクラスに、両方がメンバーを追加する子クラスがある場合です。

3.2追加の並列階層図

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

必要に応じて、図を追加する場合があります。

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

乾杯。

PS私は、ええと、フィッシュバーガーを持っていますか?

于 2012-07-14T03:56:34.227 に答える