> 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/ud7-solucions/clases-abstractas.md).

# Clases Abstractas

```java
package ClasesAbstractas;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public abstract class Empleado {
    protected String nome;
    protected String dni;
    protected LocalDate dataContratacion;
    protected double salarioBase;

    public Empleado(String nome, String dni, LocalDate dataContratacion, double salarioBase) {
        this.nome = nome;
        this.dni = dni;
        this.dataContratacion = dataContratacion;
        this.salarioBase = salarioBase;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public LocalDate getDataContratacion() {
        return dataContratacion;
    }

    public void setDataContratacion(LocalDate dataContratacion) {
        this.dataContratacion = dataContratacion;
    }

    public double getSalarioBase() {
        return salarioBase;
    }

    public void setSalarioBase(double salarioBase) {
        this.salarioBase = salarioBase;
    }

    public abstract double calcularSalario();
    public abstract String obtenerTipoJornada();

    public long calcularAntiguidade(){
        return this.dataContratacion.until(LocalDate.now(), ChronoUnit.YEARS);
    }

    @Override
    public String toString() {
        return "Empleado{" +
                "nome='" + nome + '\'' +
                ", dni='" + dni + '\'' +
                ", dataContratacion=" + dataContratacion +
                ", salarioBase=" + salarioBase +
                '}';
    }
}

```

```java
package ClasesAbstractas;

import java.time.LocalDate;

public class Manager extends Empleado{

    private int persoasACargo;
    private double plusSalarialXestion;

    public Manager(String nome, String dni, LocalDate dataContratacion, double salarioBase,
        int persoasACargo, double plusSalarialXestion) {
        super(nome, dni, dataContratacion, salarioBase);
        this.persoasACargo = persoasACargo;
        this.plusSalarialXestion = plusSalarialXestion;
    }

    public int getPersoasACargo() {
        return persoasACargo;
    }

    public void setPersoasACargo(int persoasACargo) {
        this.persoasACargo = persoasACargo;
    }

    public double getPlusSalarialXestion() {
        return plusSalarialXestion;
    }

    public void setPlusSalarialXestion(double plusSalarialXestion) {
        this.plusSalarialXestion = plusSalarialXestion;
    }

    @Override
    public double calcularSalario() {
        return salarioBase + (plusSalarialXestion * persoasACargo) + (calcularAntiguidade() * 50);
    }

    @Override
    public String obtenerTipoJornada() {
        return "Completa";
    }

    @Override
    public String toString() {
        return "Manager{" +
                "persoasACargo=" + persoasACargo +
                ", plusSalarialXestion=" + plusSalarialXestion +
                ", nome='" + nome + '\'' +
                ", dni='" + dni + '\'' +
                ", dataContratacion=" + dataContratacion +
                ", salarioBase=" + salarioBase +
                '}';
    }
}

```

```java
package ClasesAbstractas;

import java.time.LocalDate;

public class Programador extends Empleado {
    private String linguaxePrincipal;
    private int numProxectos;

    // Constructor con todos os atributos
    public Programador(String nome, String dni, LocalDate dataContratacion, double salarioBase,
                       String linguaxePrincipal, int numProxectos) {
        super(nome, dni, dataContratacion, salarioBase);
        this.linguaxePrincipal = linguaxePrincipal;
        this.numProxectos = numProxectos;
    }

    // Getters e Setters
    public String getLinguaxePrincipal() {
        return linguaxePrincipal;
    }

    public void setLinguaxePrincipal(String linguaxePrincipal) {
        this.linguaxePrincipal = linguaxePrincipal;
    }

    public int getNumProxectos() {
        return numProxectos;
    }

    public void setNumProxectos(int numProxectos) {
        this.numProxectos = numProxectos;
    }

    // salarioBase + 20 € por ano de antigüidade + 200 € se numProxectos >= 3
    @Override
    public double calcularSalario() {
        double salario = salarioBase + (calcularAntiguidade() * 20);
        if (numProxectos >= 3) {
            salario += 200;
        }
        return salario;
    }

    @Override
    public String obtenerTipoJornada() {
        return "Completa";
    }

    @Override
    public String toString() {
        return "Programador{" +
                "nome='" + nome + '\'' +
                ", dni='" + dni + '\'' +
                ", dataContratacion=" + dataContratacion +
                ", salarioBase=" + salarioBase +
                ", linguaxePrincipal='" + linguaxePrincipal + '\'' +
                ", numProxectos=" + numProxectos +
                '}';
    }
}

```

```java
package ClasesAbstractas;

import java.time.LocalDate;

public class ProgramadorJunior extends Empleado {
    private String linguaxePrincipal;
    private int horasTutorizacion;

    public ProgramadorJunior(String nome, String dni, LocalDate dataContratacion,
                             String linguaxePrincipal, int horasTutorizacion) {
        super(nome, dni, dataContratacion, 1000.0);  // salarioBase = 1000 €
        this.linguaxePrincipal = linguaxePrincipal;
        this.horasTutorizacion = horasTutorizacion;
    }

    // Getters e Setters
    public String getLinguaxePrincipal() {
        return linguaxePrincipal;
    }

    public void setLinguaxePrincipal(String linguaxePrincipal) {
        this.linguaxePrincipal = linguaxePrincipal;
    }

    public int getHorasTutorizacion() {
        return horasTutorizacion;
    }

    public void setHorasTutorizacion(int horasTutorizacion) {
        this.horasTutorizacion = horasTutorizacion;
    }

    @Override
    public double calcularSalario() {
        return salarioBase;
    }

    @Override
    public String obtenerTipoJornada() {
        return "Parcial";
    }

    @Override
    public String toString() {
        return "ProgramadorJunior{" +
                "nome='" + nome + '\'' +
                ", dni='" + dni + '\'' +
                ", dataContratacion=" + dataContratacion +
                ", salarioBase=" + salarioBase +
                ", linguaxePrincipal='" + linguaxePrincipal + '\'' +
                ", horasTutorizacion=" + horasTutorizacion +
                '}';
    }
}
```

```java
package ClasesAbstractas;

import java.time.LocalDate;

public class App {

    public static void main(String[] args) {
        Manager manager = new Manager("Ana López", "12345678A",
                LocalDate.of(2018, 5, 10), 2000,
                5, 100);

        // Crear un Programador
        Programador programador = new Programador("Carlos Pérez", "87654321B",
                LocalDate.of(2020, 3, 15), 1800,
                "Java", 4);

        // Crear un ProgramadorJunior
        ProgramadorJunior junior = new ProgramadorJunior("Beatriz Gómez", "11223344C",
                LocalDate.of(2024, 1, 20),
                "Python", 20);

        Empleado[] empleados = new Empleado[3];
        empleados[0] = manager;
        empleados[1] = programador;
        empleados[2] = junior;

        for(Empleado e: empleados){
            System.out.println(e);
            System.out.println("Antigüidade: " + e.calcularAntiguidade() + " anos");
            System.out.println("Salario calculado: " + e.calcularSalario() + " €");
            System.out.println("Xornada: " + e.obtenerTipoJornada());
        }
    }
}

```

2. Dispositivos

```java
package ClasesAbstractas.dispositivos;

public abstract class Dispositivo {

    private String numSerie;

    public Dispositivo(String numSerie) {
        this.numSerie = numSerie;
    }

    public String getNumSerie() {
        return numSerie;
    }

    public void setNumSerie(String numSerie) {
        this.numSerie = numSerie;
    }

    public abstract void encender();
}

```

```java
package ClasesAbstractas.dispositivos;

public abstract class DispositivoRecargable extends Dispositivo{

    public int bateria;

    public DispositivoRecargable(String numSerie) {
        super(numSerie);
    }

    public int getBateria() {
        return bateria;
    }

    public void setBateria(int bateria) {
        this.bateria = bateria;
    }

    public abstract void cargar();
}

```

```java
package ClasesAbstractas.dispositivos;

public class Lampara extends Dispositivo {

    private String color;
    private int watios;

    public Lampara(String numSerie, String color, int watios) {
        super(numSerie);
        this.color = color;
        this.watios = watios;
    }

    public String getColor() {
        return color;
    }

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

    public int getWatios() {
        return watios;
    }

    public void setWatios(int watios) {
        this.watios = watios;
    }

    @Override
    public void encender() {
        System.out.println("Lampara[" + this.color + this.watios + "] esta encendida");
    }


}

```

```java
package ClasesAbstractas.dispositivos;

public enum FabricanteMovil {
    SAMSUNG,
    XIAOMI,
    APPLE
}

```

```java
package ClasesAbstractas.dispositivos;

public enum FabricanteTablet {
    SAMSUNG,
    HUAWEI,
    LG
}

```

```java
package ClasesAbstractas.dispositivos;

public interface Conectable {

    public void conectarWifi();

    public void conectarDatos();
}

```

```java
package ClasesAbstractas.dispositivos;

public class Smartphone extends DispositivoRecargable implements Conectable{

    private FabricanteMovil fabricante;

    public Smartphone(String numSerie, FabricanteMovil fabricante) {
        super(numSerie);
        this.fabricante = fabricante;
    }

    @Override
    public void conectarWifi() {
        System.out.println("Conectado á Wifi");
    }

    @Override
    public void conectarDatos() {
        System.out.println("Movil ["+ fabricante + "] conectado a datos");
    }

    @Override
    public void cargar() {
        System.out.println("Cargando....");
        for(int i = this.bateria; i<=100; i++){
            System.out.println("Carga al " + i + "%");
        }
        System.out.println("Cargado!!!!");
    }

    @Override
    public void encender() {
        System.out.println("Movil ["+ fabricante + "] encendido");
    }
}

```

```java
package ClasesAbstractas.dispositivos;

public class Tablet extends DispositivoRecargable implements Conectable{

    private FabricanteTablet fabricante;

    public Tablet(String numSerie, FabricanteTablet fabricante) {
        super(numSerie);
        this.fabricante = fabricante;
    }

    @Override
    public void conectarWifi() {
        System.out.println("Conectado á Wifi");
    }

    @Override
    public void conectarDatos() {
        System.out.println("Tablet ["+ fabricante + "] non ten tarifa de datos");
    }

    @Override
    public void cargar() {
        System.out.println("Cargando....");
        System.out.println("Cargada ao 100% mediante carga rápida");
    }

    @Override
    public void encender() {
        System.out.println("Tablet ["+ fabricante + "] encendido");
    }
}

```

```java
package ClasesAbstractas.dispositivos;

public class App {
    public static void main(String[] args) {

        Lampara l1 = new Lampara("1234", "Azul", 30);
        Lampara l2 = new Lampara("1235", "Blanco", 90);
        Smartphone s1 = new Smartphone("1236",FabricanteMovil.APPLE);
        Smartphone s2 = new Smartphone("12347", FabricanteMovil.XIAOMI);
        Tablet t1 = new Tablet("1238", FabricanteTablet.LG);
        Tablet t2 = new Tablet("1239", FabricanteTablet.HUAWEI);

        Dispositivo[] dispositivos = new Dispositivo[6];
        dispositivos[0]=l1;
        dispositivos[1]=l2;
        dispositivos[2]=s1;
        dispositivos[3]=s2;
        dispositivos[4]=t1;
        dispositivos[5]=t2;

        for (Dispositivo d: dispositivos){;
            d.encender();
        }

        DispositivoRecargable[] dispositivoRecargables = new DispositivoRecargable[4];
        dispositivoRecargables[0]=s1;
        dispositivoRecargables[1]=s2;
        dispositivoRecargables[2]=t1;
        dispositivoRecargables[3]=t2;

        for(DispositivoRecargable d: dispositivoRecargables){
            d.encender();
            d.cargar();
        }

        Conectable[] conectables = new Conectable[4];
        conectables[0]=s1;
        conectables[1]=s2;
        conectables[2]=t1;
        conectables[3]=t2;

        for (Conectable c: conectables){
            c.conectarDatos();
            c.conectarWifi();
        }

    }
}

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/exercicios-java/ud7-solucions/clases-abstractas.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
