質問に答える前に、これはそれらのケースの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私は、ええと、フィッシュバーガーを持っていますか?