> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/exercicios-java/ud4-solucions/relacions-entre-clases-dependencia-asociacion-composicion-e-agregacion.md).

# Relacións entre clases: Dependencia, asociación, composición e agregación

1. Vehiculo - Motor

{% @mermaid/diagram content="classDiagram
direction LR

```
class Vehiculo {
    -String matricula
    -String marca
    -String modelo
    -Motor motor
    +Vehiculo(String matricula, String marca, String modelo, String tipo, int cabalos)
    +getMatricula() String
    +getMarca() String
    +getModelo() String
    +getMotor() Motor
    +conducir() String

}

class Motor {
    -String tipo
    -int cabalos
    +Motor()
    +Motor(String tipo, int cabalos)
    +getTipo() String
    +setTipo(String tipo) void
    +getCabalos() int
    +setCabalos(int cabalos) void
    +encender() String
}

Vehiculo "1" *--> "1" Motor : componse de" %}
```

```java
package vehiculos;

public class Motor {
    private String tipo;
    private int cabalos;
    
    public Motor() {
        this("",0);
    }

    public Motor(String tipo, int cabalos) {
        this.tipo = tipo;
        this.cabalos = cabalos;
    }
    
    public String getTipo() {
        return tipo;
    }
    
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }
    
    public int getCabalos() {
        return cabalos;
    }
    
    public void setCabalos(int cabalos) {
        this.cabalos = cabalos;
    }
    
    public String encender() {
        return "Motor " + tipo + " acendido. Potencia: " + cabalos + " CV";
    }

    @Override
    public String toString() {
        return "Motor [tipo=" + tipo + ", cabalos=" + cabalos + "]";
    }
}


```

```java
package vehiculos;

public class Vehiculo {
    private String matricula;
    private String marca;
    private String modelo;
    private Motor motor;
    
    public Vehiculo(String matricula, String marca, String modelo,String tipo, int cabalos) {
        this.matricula = matricula;
        this.marca = marca;
        this.modelo = modelo;
        this.motor = new Motor(tipo, cabalos);
    }
    
    public String getMatricula() {
        return matricula;
    }
    
    public String getMarca() {
        return marca;
    }
    
    public String getModelo() {
        return modelo;
    }
    
    public Motor getMotor() {
        return motor;
    }
        
    public String conducir() {
        String motorEncendido = motor.encender();
        return 
               "Matrícula: " + matricula + "\n" +
               "Marca: " + marca + "\n" +
               "Modelo: " + modelo + "\n" +
               "Estado: " + motorEncendido;
    }
    
    @Override
    public String toString() {
        return "Vehículo [matricula=" + matricula + 
               ", marca=" + marca + 
               ", modelo=" + modelo + 
               ", motor=" + motor + "]";
    }
}
```

```java
package vehiculos;

public class App {
    public static void main(String[] args) {
        Vehiculo miCoche = new Vehiculo("1234ABC", "Seat", "León", "Gasolina", 150);
        
        System.out.println("=== Sistema de Xestión de Vehículos ===\n");
        
        System.out.println(miCoche.conducir());

    }
}
```

2. Coche

{% @mermaid/diagram content="classDiagram
direction LR

```
%% Primeira fila: Vehiculo e Motor
class Vehiculo {
    -String matricula
    -String marca
    -String modelo
    -Motor motor
    +Vehiculo(String matricula, String marca, String modelo, String tipo, int cabalos)
    +getMatricula() String
    +getMarca() String
    +getModelo() String
    +getMotor() Motor
    +conducir() String
}

class Motor {
    -String tipo
    -int cabalos
    +Motor()
    +Motor(String tipo, int cabalos)
    +getTipo() String
    +setTipo(String tipo) void
    +getCabalos() int
    +setCabalos(int cabalos) void
    +encender() String
}

Vehiculo "1" *--> "1" Motor : componse de

%% Segunda fila: Coche e CalculadoraConsumo
class Coche {
    -int numPortas
    -String color
    +Coche(String matricula, String marca, String modelo, String tipo, int cabalos, int numPortas, String color)
    +getNumPortas() int
    +setNumPortas(int numPortas) void
    +getColor() String
    +setColor(String color) void
    +conducir() String
    +calcularConsumoMedio(double distancia) double
}

class CalculadoraConsumo {
    +calcularConsumo(int cabalos, double distancia) double
}

Coche ..> CalculadoraConsumo : utiliza

%% Relación de heranza entre Vehiculo e Coche
Vehiculo <|-- Coche : herda de" %}
```

```java
package vehiculos;

public class CalculadoraConsumo {

    public static double calcularConsumo(int cabalos, double distancia) {
        double consumoBase = cabalos * 0.05;
        double consumoPorKm = consumoBase * (distancia / 100);

        return consumoPorKm;
    }

```

```java
package vehiculos;

public class Coche extends Vehiculo {
    private int numPortas;
    private String color;

    public Coche(String matricula, String marca, String modelo, String tipo, int cabalos,
                 int numPortas, String color) {
        super(matricula, marca, modelo, tipo, cabalos);
        this.numPortas = numPortas;
        this.color = color;
    }

    public int getNumPortas() {
        return numPortas;
    }

    public void setNumPortas(int numPortas) {
        this.numPortas = numPortas;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String conducir() {
        String conduccionBase = super.conducir();
        return conduccionBase + "\n" +
                "Número de portas: " + numPortas + "\n" +
                "Color: " + color;
    }

    public double calcularConsumoMedio(double distancia) {
        int cabalos = this.getMotor().getCabalos();
        return CalculadoraConsumo.calcularConsumo(cabalos, distancia);
    }

    @Override
    public String toString() {
        return "Coche [matricula=" + getMatricula() +
                ", marca=" + getMarca() +
                ", modelo=" + getModelo() +
                ", numPortas=" + numPortas +
                ", color=" + color +
                ", motor=" + getMotor() + "]";
    }
}

```

```java
package vehiculos;

public class App {
    public static void main(String[] args) {
        Vehiculo miCoche = new Vehiculo("1234ABC", "Seat", "León", "Gasolina", 150);

        System.out.println("=== Sistema de Xestión de Vehículos ===\n");

        System.out.println(miCoche.conducir());

        Coche miCocheEspecifico = new Coche("5678DEF", "Renault", "Clio", "Diesel", 90, 3, "Vermello");

        System.out.println("=== Coche ===\n");

        System.out.println(miCocheEspecifico.conducir());

        System.out.println("\n=== Consumo medio del coche ===");

        System.out.println("Consumo medio: " +  miCocheEspecifico.calcularConsumoMedio(100));

    }
}
```

3. Camión

{% @mermaid/diagram content="classDiagram
direction LR

```
%% Primeira fila: Vehiculo e Motor
class Vehiculo {
    -String matricula
    -String marca
    -String modelo
    -Motor motor
    +Vehiculo(String matricula, String marca, String modelo, String tipo, int cabalos)
    +getMatricula() String
    +getMarca() String
    +getModelo() String
    +getMotor() Motor
    +conducir() String
}

class Motor {
    -String tipo
    -int cabalos
    +Motor()
    +Motor(String tipo, int cabalos)
    +getTipo() String
    +setTipo(String tipo) void
    +getCabalos() int
    +setCabalos(int cabalos) void
    +encender() String
}

Vehiculo "1" *--> "1" Motor : componse de

%% Segunda fila: Coche e CalculadoraConsumo
class Coche {
    -int numPortas
    -String color
    +Coche(String matricula, String marca, String modelo, String tipo, int cabalos, int numPortas, String color)
    +getNumPortas() int
    +setNumPortas(int numPortas) void
    +getColor() String
    +setColor(String color) void
    +conducir() String
    +calcularConsumoMedio(double distancia) double
}

class CalculadoraConsumo {
    +calcularConsumo(int cabalos, double distancia) double
}

Coche ..> CalculadoraConsumo : utiliza

%% Tercera fila: Camion e Conductor
class Camion {
    -double capacidadCarga
    -Conductor conductor
    +Camion(String matricula, String marca, String modelo, String tipo, int cabalos, double capacidadCarga)
    +getCapacidadCarga() double
    +setCapacidadCarga(double capacidadCarga) void
    +getConductor() Conductor
    +asignarConductor(Conductor conductor) void
    +conducir() String
}

class Conductor {
    -String dni
    -String nome
    -String permiso
    +Conductor(String dni, String nome, String permiso)
    +getDni() String
    +getNome() String
    +getPermiso() String
    +setPermiso(String permiso) void
    +toString() String

}

Camion "1" --> "0..1" Conductor : ten asignado

%% Relacións de heranza
Vehiculo <|-- Coche : herda de
Vehiculo <|-- Camion : herda de" %}
```

```java
package vehiculos;

public class Conductor {
    private String dni;
    private String nome;
    private String permiso;

    public Conductor(String dni, String nome, String permiso) throws Exception {
        this.dni = dni;
        this.nome = nome;
        setPermiso(permiso);
    }

    public String getDni() {
        return dni;
    }

    public String getNome() {
        return nome;
    }

    public String getPermiso() {
        return permiso;
    }

    public void setPermiso(String permiso) throws Exception {
        if (permiso.equals("C") || permiso.equals("C1") || permiso.equals("C+E")) {
            this.permiso = permiso;
        } else {
            throw new IllegalArgumentException("Permiso non válido. Debe ser C, C1 ou C+E");
        }
    }

    @Override
    public String toString() {
        return "Conductor [DNI=" + dni + ", Nome=" + nome + ", Permiso=" + permiso + "]";
    }
}


```

```java
package vehiculos;

public class Camion extends Vehiculo {
    private double capacidadCarga;
    private Conductor conductor;

    public Camion(String matricula, String marca, String modelo,
                  String tipoMotor, int cabalos, double capacidadCarga) {
        super(matricula, marca, modelo, tipoMotor, cabalos);
        this.capacidadCarga = capacidadCarga;
        this.conductor = null;
    }

    public double getCapacidadCarga() {
        return capacidadCarga;
    }

    public void setCapacidadCarga(double capacidadCarga) {
        this.capacidadCarga = capacidadCarga;
    }

    public Conductor getConductor() {
        return conductor;
    }

    public void asignarConductor(Conductor conductor) {
        this.conductor = conductor;
    }

    @Override
    public String conducir() {
        String conduccionBase = super.conducir();
        StringBuilder sb = new StringBuilder(conduccionBase);
        sb.append("\n");
        sb.append("Tipo de vehículo: Camión\n");
        sb.append("Capacidade de carga: ").append(capacidadCarga).append(" toneladas\n");

        if (conductor != null) {
            sb.append("Conductor asignado: ").append(conductor.getNome())
                    .append(" (Permiso: ").append(conductor.getPermiso()).append(")");
        } else {
            sb.append("ATENCIÓN: Non hai conductor asignado!");
        }

        return sb.toString();
    }

    @Override
    public String toString() {
        return "Camión [matricula=" + getMatricula() +
                ", marca=" + getMarca() +
                ", modelo=" + getModelo() +
                ", capacidadeCarga=" + capacidadCarga +
                ", conductor=" + (conductor != null ? conductor.getNome() : "Ningún") +
                ", motor=" + getMotor() + "]";
    }
}

```

```java
package vehiculos;

public class App {
    public static void main(String[] args) {
        Vehiculo miCoche = new Vehiculo("1234ABC", "Seat", "León", "Gasolina", 150);

        System.out.println("=== Sistema de Xestión de Vehículos ===\n");

        System.out.println(miCoche.conducir());

        Coche miCocheEspecifico = new Coche("5678DEF", "Renault", "Clio", "Diesel", 90, 3, "Vermello");

        System.out.println("=== Coche ===\n");

        System.out.println(miCocheEspecifico.conducir());

        System.out.println("\n=== Consumo medio del coche ===");

        System.out.println("Consumo medio: " +  miCocheEspecifico.calcularConsumoMedio(100));

        Camion miCamion = new Camion("1234TRC", "Mercedes", "Actros",
                "Diésel", 450, 20.5);

        try {
            Conductor conductor1 = new Conductor("12345678A", "Juan Pérez", "C+E");

            miCamion.asignarConductor(conductor1);
        } catch (Exception e){
            System.out.println("Error asignando conductor");
        }
            System.out.println("\n=== Conducir ===");

        System.out.println(miCamion.conducir());

    }
}
```
