UML

En el artículo de hoy, voy a intentar resolver una duda que suele aparecer frecuentemente, y es ¿Cuándo usar clases base "normales", cuando usar clases abstractas y cuando interfaces? Repasaremos que es cada una y cuando sería recomendable utilizarla.

Clase

Heredaremos de una clase "normal", cuando tengamos otras clases que resulten en una especialización de la primera y no haya ninguna obligación de implementar métodos de la clase madre. Suele ser el caso más habitual de herencia. Por ejemplo, si tenemos una clase base con una serie de comportamientos ya predefinidos para todas las clases derivadas, pero cada clase derivada, va a sobre-escribir partes distintas de la clase madre.

Clase abstracta

Una clase abstracta es aquella en la que alguno de sus métodos es abstracto. Pues "nos has descubierto la pólvora" estarás pensando 😛. Paso a explicarme mejor, un método abstracto dentro de una clase es aquel que no tiene "contenido" o cuerpo. Esto obliga a que todas las clases que hereden de una clase abstracta, o implementen esos métodos, o serán también clases abstractas.

Veamos un ejemplo con nuestro amigo Super Mario de nuevo. Imaginad que tenemos esta clase abstracta:

abstract class Enemigo {
  public mover() {
    // Lógica de mover
  }

  public abstract atacar(): number;
}

Como se puede comprobar, tenemos un método mover(), que ya tendría una serie de lógica por defecto. Las clases hijas, no tendrían por qué sobrescribir dicho método. Sin embargo, el método atacar() es abstracto, no tiene cuerpo; es por ello que se obliga a toda clase hija (que no sea abstracta) a tener que implementarlo:

class Goomba extends Enemigo {
  public atacar(): number {
    // Lógica de atacar
  }
}

Por lo que podríamos decir que usaremos las clases abstractas cuando tengamos la necesidad de proporcionar una lógica común a las clases hijas, pero existan operaciones que queramos que cada clase hija deba implementar por su cuenta.

Interfaz

En el caso de las interfaces, podríamos pensar que son clases abstractas puras, es decir, clases con todos los métodos abstractos (y además con visibilidad pública). Es más, en el caso de lenguajes como C++, al no haber interfaces, éstas pasaran a definirse con clases abstractas puras.

Las interfaces a nivel semántico no requieren tener obligatoriamente relación alguna con las clases, simplemente permiten definir comportamientos comunes. Eso sí, las clases que implementan las interfaces están obligadas a implementar todos sus métodos.

Veamos un ejemplo:

interface Polígono {
  getArea(): number;
}

class Cuadrado implements Polígono {
  public getArea(): number {
    return Math.pow(this.lado, 2);
  }
}

class Rectángulo implements Polígono {
  public getArea(): number {
    return this.base * this.altura;
  }
}

Como resumen tendríamos lo siguiente (también lo puedes ver en Instagram):


Algunos libros sobre programación orientada a objetos con los que aprender más:

La imagen de este artículo proviene de Freepik.

Comparte este artículo con quien quieras
5 cosas que haces mal en JavaScript
Métodos del objeto Promise en JavaScript

Leave a Comment

Your email address will not be published. Required fields are marked *

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