Antes de la pregunta de respuesta, este es uno de esos casos, donde es una buena idea dividir las relaciones de jerarquía de las relaciones de composición, como si fueran tipos diferentes de diagramas.
Nota: Agregué Engine al diagrama, como "protected", y prefijo "Class", para evitar confusiones.
(1) Diagrama Composición
Un objeto de "CarClass" su compuesta por 1 solo objeto de "EngineClass".
..............................................................................
..+-------------------------------------+........+-------------------------+..
..| <<abstract>> |........| <<abstract>> |..
..| CarClass |........| EngineClass |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+-------------------------+..
..| [+] acelerate(): void <<virtual>> |.....................................
..+-------------------------------------+.....................................
..............................................................................
(2,1) Inheritance Diagrama
Un objeto de "CarClass" puede tener clases secundarias, en ciertos escenarios.
...........................................
..+-------------------------------------+..
..| <<abstract>> |..
..| CarClass |..
..+-------------------------------------+..
..| [#] Engine: EngineClass |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>> |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................|.................................................................
....................+------------------------------------------+......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..| <<concrete>> |....| <<concrete>> |..
..| StreetCarClass |....| OffRoadCarClass |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] acelerate(): void <<override>> |....| [+] acelerate(): void <<override>> |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................
(2,2) Inheritance Diagrama
Un objeto de "EngineClass" puede tener clases secundarias, en ciertos escenarios.
...........................................
..+-------------------------------------+..
..| <<abstract>> |..
..| EngineClass |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>> |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................+------------------------------------------+......................
....................|..........................................|......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..| <<concrete>> |....| <<concrete>> |..
..| StreetEngineClass |....| OffRoadEngineClass |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] startEngine(): void <<override>>|....| [+] startEngine(): void<<override>> |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................
3 respuesta
Ahora, este es un caso, donde una clase tiene un uno unleast miembro de componer, y su tipo puede ser anulado, cuando la clase principal su overriden. Esto a veces se denomina "Patrón de software de jerarquía de Paralell" o "Patrón de software de doble jerarquía".
Solo ha mencionado 2 subclases de cada clase principal, pero, en realidad, podría haber más.
Normalmente hago gráficos como este de 2 maneras. Primero, hago el primer diagrama, agregando un comentario, que indica que es este caso.
3.1 Principal Paralell Diagrama de Jerarquía
..............................................................................
..+-------------------------------------+........+-------------------------+..
..| <<abstract>> |........| <<abstract>> |..
..| CarClass |........| EngineClass |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+------------+------------+..
..| [+] acelerate(): void <<virtual>> |.....................|...............
..+--------------+----------------------+.....................|...............
.................|............................................|...............
.................+--------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........| Note: |....................................................
........| Paralell /....................................................
........| Hierarchy /| ...................................................
........| /|....................................................
........+-------------/--+....................................................
..............................................................................
El segundo caso, su cuando ambas clases tienen clases hijas que tanto agregar miembros.
3.2 adicional Paralell Diagrama de Jerarquía
..............................................................................
..+---------------------------------------+........+-------------------------+..
..| <<concrete>> |........| <<concrete>> |..
..| OffRoadCarClass |........| OffRoadEngineClass |..
..+---------------------------------------+........+-------------------------+..
..| [+] createEngine(): void <<override>> |<*>-----+ [+] startEngine(): void |..
..+---------------------------------------+........| [+] nitroLevel(): void |..
..| [+] useNitro(): void |........+------------+------------+..
..| [+] acelerate(): void <<override>> |.....................|...............
..+--------------+------------------------+.....................|...............
.................|..............................................|...............
.................+----------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........| Note: |....................................................
........| Paralell /....................................................
........| Hierarchy /| ...................................................
........| /|....................................................
........+-------------/--+....................................................
..............................................................................
I puede añadir diagramas adicionales, si necesarilly.
4 Muéstrame el código
el fin, para gestionar este jerarquías "paralelas", por lo general, la creación de los elementos compuestos su gestionado por un método sobreescrito.
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
Cheers.
P.S. ¿Puedo, ur, haz a Fishburguer?
Esto huele a tarea. Si es así, márcalo como tal. – Jochen
No, no es tarea: P – annouk