"¡Hola, Amigo! Ayer fuiste educado en las formas de las clases abstractas. Ahora es el momento de profundizar nuestro conocimiento. Quiero enseñarte cómo usar las clases abstractas correctamente".

Es difícil pensar en una analogía del mundo real para una clase abstracta. Una clase suele ser un modelo de alguna entidad. Pero una clase abstracta contiene métodos que no se han implementado y puede contener métodos que se han implementado. ¿Qué significa eso? ¿Qué analogía para una clase abstracta podemos encontrar? ¿Existe tal cosa en el mundo real?

En realidad, lo hay. Imagine el chasis de un automóvil casi terminado en una cinta transportadora. Puedo instalar un motor mejorado o un motor altamente eficiente. Ya sea un interior de cuero o tapicería de tela. La implementación específica del automóvil aún no está determinada. Además, el chasis podría usarse para producir varias implementaciones específicas. Pero nadie quiere el auto en su forma actual. Esta es una clase abstracta clásica : crear instancias de ella no tendría sentido, por lo que no puede crearlas; la clase solo tiene sentido debido a los muchos herederos de pleno derecho que se crearán sobre su base.

"Eso es bastante fácil".

Pero puede haber analogías aún más abstractas. Más como interfaces con algunos métodos implementados. Por ejemplo, considere un intérprete profesional . Sin especificar los idiomas de origen y de destino, tenemos un « traductor abstracto ». O considere un guardaespaldas. Podemos saber que domina las artes marciales y puede proteger a su cliente. Pero qué artes marciales y cómo protegerá al cliente son "detalles de implementación" de cada guardaespaldas específico.

Veamos un ejemplo:

codigo Java Descripción
abstract class BodyGuard
{
 abstract void applyMartialArts(Attacker attacker);

 void shoot(Attacker attacker)
 {
    gun.shoot(attacker);
 }

 void saveClientLife(Attacker attacker)
 {
  if (attacker.hasGun())
     shoot(attacker);
  else
     applyMartialArts(attacker);
 }
}
La clase BodyGuard determina cómo lidiar con un ataque: disparar o usar artes marciales.

Sin embargo, no se especifica el arte marcial específico, aunque estamos seguros de que la habilidad existe.

Podemos crear varios guardaespaldas diferentes (heredando esta clase). Todos ellos podrán proteger al cliente y disparar al atacante.

"Tienes razón. Se parece mucho a una interfaz con algunos métodos implementados".

"Sí, este tipo de clase abstracta es común entre las clases estándar de Java SE".