Abstracción
En Java, las clases abstractas son clases que no pueden ser instanciadas directamente. En cambio, se utilizan como una plantilla para crear otras clases que heredan de ellas. Una clase abstracta puede contener métodos abstractos, que son métodos que no tienen un cuerpo y deben ser implementados por las clases que heredan de la clase abstracta. Estos métodos son utilizados para definir un comportamiento esperado para las clases hijas.
Por ejemplo, podríamos tener una clase abstracta llamada "Animal" que tiene un método abstracto llamado "makeSound()". Las clases "Dog" y "Cat" podrían heredar de "Animals" y proporcionar implementaciones específicas para el método "makeSound()", como "bark" y "meow" respectivamente.
Para declarar una clase como abstracta se usa la palabra reservada "abstract" en la declaración de la clase. Para declarar un método como abstracto se usa la palabra reservada "abstract" en la declaración del método y no se proporciona cuerpo al método.
Ejemplo:
abstract class Animals {
abstract void makeSound();
}
class Dog extends Animals {
void makeSound(){
System.out.println("bark");
}
}
class Cat extends Animals {
void makeSound(){
System.out.println("meow");
}
}
En este ejemplo, la clase "Animals" es una clase abstracta que tiene un método abstracto "makeSound()". Las clases "Dog" y "Cat" heredan de "Animals" y proporcionan implementaciones específicas para el método "makeSound()".
Supongamos que estás trabajando en el desarrollo de un sistema de gestión para una empresa de envío y logística. En este sistema, hay varios tipos de vehículos de transporte, como camiones, furgonetas y bicicletas. Cada tipo de vehículo tiene características comunes, como un identificador único, una ubicación actual y la capacidad de calcular el tiempo estimado de entrega. Sin embargo, cada tipo de vehículo tiene implementaciones específicas para estas características.
En este escenario, puedes utilizar clases abstractas para representar la estructura común de los vehículos y requerir que las clases derivadas implementen métodos específicos. Aquí hay un ejemplo simplificado:
abstract class VehiculoTransporte {
private int id;
private String ubicacionActual;
public VehiculoTransporte(int id, String ubicacionActual) {
this.id = id;
this.ubicacionActual = ubicacionActual;
}
public abstract double calcularTiempoEntrega(String destino);
public void mostrarDetalles() {
System.out.println("ID: " + id);
System.out.println("Ubicación Actual: " + ubicacionActual);
}
}
class Camion extends VehiculoTransporte {
private double velocidadPromedio;
public Camion(int id, String ubicacionActual, double velocidadPromedio) {
super(id, ubicacionActual);
this.velocidadPromedio = velocidadPromedio;
}
@Override
public double calcularTiempoEntrega(String destino) {
// Cálculo del tiempo estimado de entrega para camiones
// basado en la distancia y la velocidad promedio
// (Implementación específica para camiones)
return 0.0; // Implementación simulada
}
}
class Furgoneta extends VehiculoTransporte {
private int capacidadCarga;
public Furgoneta(int id, String ubicacionActual, int capacidadCarga) {
super(id, ubicacionActual);
this.capacidadCarga = capacidadCarga;
}
@Override
public double calcularTiempoEntrega(String destino) {
// Cálculo del tiempo estimado de entrega para furgonetas
// basado en la capacidad de carga y la ubicación
// (Implementación específica para furgonetas)
return 0.0; // Implementación simulada
}
}
En este ejemplo, VehiculoTransporte
es una clase abstracta que contiene la estructura común de los vehículos de transporte. Define un constructor común y un método abstracto calcularTiempoEntrega()
, que debe ser implementado por las clases derivadas (en este caso, Camion
y Furgoneta
). Cada clase derivada proporciona su propia implementación del método calcularTiempoEntrega()
específica para ese tipo de vehículo. Las clases derivadas también pueden tener sus propios atributos y métodos adicionales. El uso de clases abstractas ayuda a mantener una estructura común y a asegurarse de que las clases hijas implementen ciertos comportamientos.
https://www.tutorialspoint.com/java/java_abstraction.htm