Principios de Programación Orientada a Objetos: Herencia, Polimorfismo y Relaciones entre Clases

Clase Abstracta

Declararíamos una clase abstracta cuando no tiene sentido instanciar objetos directamente de ella, sino que sirve como base para otras clases. Una clase abstracta contiene métodos abstractos que deben ser implementados por las subclases.

Las consecuencias son que no se pueden crear instancias directamente de una clase abstracta y que las subclases deben implementar todos los métodos abstractos, lo que asegura que la estructura de la clase base se respeta en todas las derivaciones.

Herencia y Polimorfismo

¿Qué es la herencia y cómo se relaciona con el polimorfismo?

La herencia es un principio de la programación orientada a objetos donde una clase hereda atributos y métodos de otra clase. Esto permite reutilizar código y crear una jerarquía de clases.

Una relación de herencia se implementa en un diagrama de clases cuando se desea modelar una jerarquía de clases que comparten atributos y métodos comunes. Esto permite la reutilización de código.

El polimorfismo se relaciona con la herencia porque permite que objetos de diferentes clases derivadas se traten como objetos de una clase base común. Así, se pueden utilizar métodos de la clase base en objetos de clases derivadas.

Clase Asociativa

¿Qué es una clase asociativa?

Una clase asociativa es una clase que se utiliza para representar una relación muchos a muchos entre dos clases en un diagrama de clases. Esta clase no sólo actúa como un enlace entre dos clases asociadas, sino que también puede contener atributos y métodos adicionales que son específicos de las relaciones entre dos clases.

Composición y Agregación de Clases

¿Qué es una composición de clases y cómo se diferencia de una agregación?

La composición de clases es una relación fuerte entre dos objetos donde uno no puede existir sin el otro. Se suele describir como una relación “es parte de” o “contiene”. Ejemplo: Un “Coche” y su “Motor”, si el coche se destruye el motor también.

La agregación es una relación más débil entre dos objetos donde uno puede existir independientemente del otro. Se suele describir como una relación “tiene un” o “es parte de”. Ejemplo: Un Departamento y sus Empleados. Si el Departamento desaparece los Empleados pueden seguir existiendo.

Include y Extends en Casos de Uso

Include se usa para indicar que un caso de uso incorpora la funcionalidad de otro caso de uso. Es como decir que el primero no puede existir sin el segundo. Ejemplo: Si tenemos dos casos de uso, uno es “Procesar Pedido” y el otro “Iniciar Sesión”, si vemos que Procesar Pedido no funciona hasta que se ejecute Iniciar Sesión podemos decir que “Procesar Pedido” incluye “Iniciar Sesión”.

Extends se usa para indicar que un caso de uso extiende opcionalmente la funcionalidad de otro caso de uso. La extensión puede añadir comportamientos adicionales al caso de uso base bajo ciertas condiciones.

Implementación de Relaciones en Código

Explicación de una agregación en un diagrama de clases

Para traducir una relación de agregación de un diagrama de clases a código Java, primero identificaremos la relación determinando la clase contenedora y la clase parte. Luego definiremos ambas clases en Java. En la clase contenedora añadiremos un atributo, que es una instancia de la clase parte. Se implementa el constructor y los métodos de la clase contenedora, para inicializar y gestionar el atributo parte.

public class Persona {
    private String nombre;
    //Constructor
    public Persona (String nombre) {
        this.nombre = nombre;
    }
}

Explicación de un diagrama de casos de uso

Un diagrama de casos de uso es una herramienta utilizada en el análisis y diseño de sistemas para describir las interacciones entre los actores y el sistema que se está desarrollando. Este diagrama ayuda a identificar los requisitos funcionales del sistema y a entender qué funcionalidades son necesarias. Facilita la comunicación entre los desarrolladores y los stakeholders asegurando que todos tengan una comprensión clara de las expectativas del sistema.

Implementación de un Proyecto Java

Pasos a seguir para implementar un proyecto Java

  1. Analizar las clases: escribir cada una de las clases que se proponen
  2. Definir las clases: describir cada una de las clases
  3. Implementar los atributos: escribiremos los atributos que queremos añadir
  4. Implementar los métodos: definiremos los métodos para cada atributo
  5. Definición de las relaciones: añadiremos las agregaciones, asociaciones, herencias y composiciones
  6. Añadimos getters y setters: para acceder y modificar los métodos privados de cada clase.
  7. Probaremos que todo funcione: haremos de manera unitaria la prueba de las clases, atributos y los métodos.

Añadir un objeto en una ArrayList en Java

Para añadir un elemento a una ArrayList en Java se utiliza el método add().

ArrayList<String> lista = new ArrayList<>();
lista.add("Nuevo elemento");

Cardinalidad en Diagramas de Clases

¿Qué es la cardinalidad?

La cardinalidad en un diagrama de clases describe el número de instancias de una clase que pueden estar asociados con una instancia de otra clase.

Ejemplos:

  • 1 a 1: Cada instancia de una clase está asociada con exactamente una instancia de otra clase.
  • 1 a Muchos: Cada instancia de una clase se asocia con diferentes instancias de otra clase.
  • Muchos a Muchos: Varias instancias de una clase se asocian con varias instancias de otra clase.

Aplicar una relación de asociación

public class Profesor {
    private String nombre;
    private Curso curso;
    public Profesor(String nombre, Curso curso) {
        this.nombre = nombre;
        this.curso = curso;
    }
    //getters y setters
}

public class Curso {
    private String matricula;
    public Curso(String matricula) {
        this.matricula = matricula;
    }
    //getters y setters
}

Crear una clase con herencia

public class Persona {
    private String nombre;
    private int edad;
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
    //getters y setters
}

public class Estudiante extends Persona {
    private String nota;
    public Estudiante(String nombre, int edad, String nota) {
        super(nombre, edad); // Llama al constructor de la clase padre
        this.nota = nota;
    }
    //getters y setters
}

Aplicar una relación de agregación de un diagrama de clases

Public class Departamento {

                Private String nombre;

                Private List empleados;

                Public Departamento (String nombre){

                This.nombre=nombre;

                This.empleado= new Arraylist();

                }

Public void agregarEmpleado(Empleado empleados){

                Empleados.add(empleado);

                }

}

Public class Empleado {

                Private String nombre;

                Public Empleado (String nombre){

                This.nombre=nombre;

                }

}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.