Abstracción en Programación Orientada a Objetos con C#

Clase 15 de 19Curso de Programación Orientada a Objetos con C#

Resumen

¿Qué es la abstracción en la programación orientada a objetos?

La abstracción es un concepto poderoso en la programación orientada a objetos (POO) que permite crear componentes más genéricos y reutilizables. Al no incluir detalles específicos desde el inicio, podemos aplicar abstracción para beneficiar tanto el diseño como la reutilización del código. Este principio se combina bien con otros elementos avanzados de la programación como los patrones de diseño.

¿Cómo implementar abstracción y herencia en C#?

Para integrar la abstracción en nuestro código, podemos usar clases y métodos abstractos en C#. Aquí presentamos un ejemplo ilustrativo:

// Definición de una clase abstracta con un método abstracto
public abstract class Heroe {
    public abstract string SalvarElMundo();
}

Este método SalvarElMundo() es abstracto y no contiene detalles de implementación. La clase Heroe debe ser abstracta, dado que una clase no abstracta no puede tener métodos abstractos.

¿Qué ocurre al heredar clases abstractas?

Al heredar de una clase abstracta, como es el caso de nuestra clase SuperHeroe que hereda Heroe, es obligatorio implementar el método abstracto en la clase hija. A continuación, el ejemplo de implementación:

public class SuperHeroe : Heroe {
    public override string SalvarElMundo() {
        return $"{NombreIdentidadSecreta} ha salvado el mundo";
    }
}

Visual Studio ayuda a identificar este tipo de errores y exige que se añada el override para implementar el cuerpo del método abstracto.

¿Cómo podemos utilizar tanto métodos abstractos como no abstractos?

Además de métodos abstractos, las clases abstractas también pueden contener métodos "normales" que no necesitan ser implementados en las clases hijas. Aquí un ejemplo que muestra ambos tipos de métodos en una clase:

public abstract class Heroe {
    // Método abstracto
    public abstract string SalvarElMundo();
    
    // Método no abstracto
    public string SalvarLaTierra() {
        return $"{Nombre} ha salvado la tierra";
    }
}

La clase SuperHeroe puede heredar tanto métodos abstractos como no abstractos sin mostrar errores al no tener que sobrescribir el método no abstracto:

public class SuperHeroe : Heroe {
    public override string SalvarElMundo() {
        return $"{NombreIdentidadSecreta} ha salvado el mundo";
    }
}

¿Cómo aprovechar las propiedades abstractas?

Similar a los métodos, se pueden declarar propiedades abstractas obligando a las clases hijas a definirlas. Esto se hace de la siguiente manera:

public abstract class Heroe {
    public abstract string Nombre { get; set; }
}

En la clase SuperHeroe, la implementación de propiedades abstractas también es obligatoria:

public class SuperHeroe : Heroe {
    // Implementación de la propiedad abstracta
    public override string Nombre { get; set; } = "Superman";
    
    public override string SalvarElMundo() {
        return $"{NombreIdentidadSecreta} ha salvado el mundo";
    }
}

La abstracción es esencial para permitir la evolución de nuestros sistemas sin refactorizaciones masivas, maximizando la reutilización de código y la cohesión. Estos principios no solo mejoran el diseño del software sino que impulsan la robustez y el mantenimiento a largo plazo. Sigamos explorando estos conceptos en nuestro camino para dominar la programación orientada a objetos.