jueves, 19 de septiembre de 2024

■ Java ► Herencia

La herencia entre clases no es mas que heredar de una clase superior (súper clase) sus atributos y métodos a una clase inferior, para que ésta además de tener sus atributos y métodos propios tenga también los de la clase superior de la que hereda.

Retomando el ejemplo anterior (ver clase Persona aquí) se tenía la clase "Persona", de la cual vamos a heredar en este ejemplo.


■ Sub clase Empleado

Si en nuestro programa manejamos diferentes tipos de personas, por ejemplo Empleados y Clientes, ambos tienen atributos en común y atributos distintos, y para no repetir en ambas clases los atributos en común es que se crea una clase superior que contenga dichos atributos y luego estas subclases simplemente los hereden y funcionen como si fueran suyos.

La clase Persona tiene:
  • Nombre
  • Teléfono
  • Dirección

La clase Empleado tiene:
  • idEmpleado
  • Departamento
  • Turno

Al hacer que Empleado herede de Persona, éste hereda los atributos de la clase superior, quedando empleado de la siguiente forma:

Empleado:
  • Nombre
  • Teléfono
  • Dirección
  • idEmpleado
  • Departamento
  • Turno
Pero esto es virtual, ya que los atributos "nombre, teléfono y dirección" son de Persona, pero Empleado puede usarlos como si fueran suyos. De igual forma sucede con los métodos que tenga Persona.

Empleado hereda de Persona



■ Estructura de la clase Empleado

Es casi igual que la clase Persona, los atributos y métodos se declaran de la misma forma (ver clase Persona) pero el método constructor cambia ligeramente.

La estructura de la clase es así:

class <nombre_de_la_clase> extends <nombre_clase_superior> {
    // Atributos (igual que en clase Persona)

    // Método constructor
    public <nombre_de_la_clase>(
        // Atributos de la clase superior
        // Atributos propios
    ) {
        super(<Atributos de clase superior separados por coma>);
        // Asignación de parámetros a atributos propios con this
    }

    // Setters (igual que en clase Persona)

    // Getters (igual que en clase Persona)
}

Donde:
"extends" se refiere a la herencia, indica que la clase en cuestión hereda de otra clase misma que se señala mediante su nombre.
"super" se encarga de asignar los atributos de la clase de la que se hereda al crear el objeto.


■ Clase Empleado en Java

class Empleado extends Persona{
    int idEmpleado;
    String departamento;
    String turno;
// Método constructor
// recibe como parámetros todas
    public Empleado(
        String _nombre, String _telefono, String _direccion,
        int _idEmpleado, String _departamento, String _turno
    ) {
        super(_nombre, _telefono, _direccion);
        this.idEmpleado = _idEmpleado;
        this.departamento = _departamento;
        this.turno = _turno;
    }
    // Setters
    public void setIdEmpleado(int _idEmpleado) {
        this.idEmpleado = _idEmpleado;
    }
    public void setDepartamento(String _departamento) {
        this.departamento = _departamento;
    }
    public void setTurno(String _turno) {
        this.turno = _turno;
    }
    // Getters
    public int getIdEmpleado() {
        return this.idEmpleado;
    }
    public String getDepartamento() {
        return this.departamento;
    }
    public String getTurno() {
        return this.turno;
    }
}


Considerando el programa completo la clase Empleado podría situarse después de la clase Persona y antes de la clase principal:

class Persona {
    // código de la clase
}

class Empleado {
    // código de la clase
}

public class Main {
    public static void main(String args[]) {
        // código clase principal
    }
}


■ Creación y uso del objeto empleado

En el ejemplo de la clase "Persona" se vió cómo crear el objeto persona y usar sus métodos, en este otro ejemplo dado que lo que queremos es crear empleados no usaremos directamente la clase "Persona" sino que usaremos la clase "Empleado" que hereda de persona por lo que nuestro objeto "empleado" tendrá sus atributos más los de "Persona".


Clase principal:

import java.util.Scanner;

/*
      Aquí irían las clases
      Persona y Empleado
*/

public class Main {
    public static void main (String args[]) {
        Scanner sc = new Scanner(System.in);
        String nuevaDireccion, nuevoDepartamento;

        // Método contructor, se crea el objeto empleado
        Empleado empleado = new Empleado(
            "John Smith",
            "(555) 123 456 7890",
            "Main Street",
            1001,
            "Gerencia",
            "Matutino"
        );
        // Se muestran los datos del empleado usando los GETTERS
        System.out.println(); // Se hace un salto de línea
        System.out.println("Datos del empleado");
        System.out.println("Nombre: \t" + empleado.getNombre());
        System.out.println("Teléfono: \t" + empleado.getTelefono());
        System.out.println("Dirección: \t" + empleado.getDireccion());
        System.out.println("Número: \t" + empleado.getIdEmpleado());
        System.out.println("Departamento: \t" + empleado.getDepartamento());
        System.out.println("Turno: \t\t" + empleado.getTurno());
        System.out.println();
        // Se solicitan algunos nuevos valores para el objeto
        System.out.println("Editar dirección y departamento");
        System.out.println("Ingrese la nueva dirección");
        nuevaDireccion = sc.nextLine();
        System.out.println("Ingrese el nuevo departamento");
        nuevoDepartamento = sc.nextLine();
        System.out.println();
        // Se asignan los nuevos valores usando los SETTERS
        empleado.setDireccion(nuevaDireccion); // Método heredado
        empleado.setDepartamento(nuevoDepartamento); // Método propio
        // Se muestran nuevamente los datos usando los GETTERS
        System.out.println(); // Se hace un salto de línea
        System.out.println("Datos del empleado");
        System.out.println("Nombre: \t" + empleado.getNombre());
        System.out.println("Teléfono: \t" + empleado.getTelefono());
        System.out.println("Dirección: \t" + empleado.getDireccion());
        System.out.println("Número: \t" + empleado.getIdEmpleado());
        System.out.println("Departamento: \t" + empleado.getDepartamento());
        System.out.println("Turno: \t\t" + empleado.getTurno());
        System.out.println();
    }
}


Como se puede observar en el código, al crear el objeto "empleado" se le deben pasar tanto los valores de "Persona" como los de "Empleado".
Al mostrar los datos del empleado en pantalla invocamos los métodos "getNombre(), getTelefono() y getDirección()" como si fueran de "Empleado" cuando son de "Persona", pero como "Empleado" hereda de "Persona" los métodos se pueden usar como suyos.
Lo mismo sucede con los métodos setters, se pueden invocar los de "Persona" ya que están heredados.

Para la clase "Cliente" y cualquier otra clase que herede de Persona se hace exactamente lo mismo.

No hay comentarios:

Publicar un comentario