Abstracción

La abstracción en programación es una manera de reducir, simplificar y encapsular la complejidad de un sistema o proceso que permite a los desarrolladores trabajar con un nivel de detalle basada en el principio de “ocultamiento de informacion” o “principio de ocultacion”, uno de los pilares de la programación orientada a objetos.

Se puede aplicar a diferentes niveles de programación, desde el diseño de clases y objetos hasta el uso de lenguajes de alto nivel que permiten expresar las soluciones de forma mas natural y cercana a modelos conceptuales que representan las caracteristicas esenciales de las entidades o procesos del mundo real.

Por ejemplo podemos definir una clase abstracta llamada Automovil que presente el concepto general de un vehículo de cuatro ruedas que se mueve por medio de un motor.

Esta clase tendría propiedades como: marca, modelo, color, año, kilometraje, etc. y métodos como: encender, apagar, acelerar, frenar, etc.

A partir de la clase abstracta podemos crear clases especificas que hereden sus propiaedades y métodos, pero que también tengan sus propias caractéristicas especificas. Por ejemplo, podríamos crear una clase llamada Deportivo que hereda de Automovil y que tenga propiedades adicionales como: velocidadMaxima, tipoDeMotor, numeroDePuertas, etc. y métodos adicionales como: turbo, drift, etc.

De esta manera, podemos crear objetos de la clase Deportivo que sean instancias de la clase Automovil y que compartan sus características y comportamientos generales, pero que también tengan sus propias particularidades, por ejemplo, podríamos crear un objeto llamado miDeportivo que tenga los siguientes valores:
marca: “Ferrari”
modelo: “F8 Spider”
color: “Rojo”
año: 2023
kilometraje: 0
velocidadMaxima: 340
tipoDeMotor: “V8”
numeroDePuertas: 2

El objetivo principal de la abstraccion en el area de programacion es simplificar el desarrollo y el mantenimiento del software al dividir un sistema en componentes abstraidos y los programadores pueden trabajar en partes especificas sin preocuparse de cómo funcionan otras partes. Esto facilita la colaboracion en equippos de desarrollo, ya que cada miembro del equipo puede centrarse en su area de experiencia sin necesidad de comprender los detalles de todo el sistema.

El ejemplo anterior podria estar representado de la siguiente manera en lenguaje C#

    // Clase abstracta Automovil
    public abstract class Automovil
    {
        // Propiedades comunes a todos los automóviles
        public string Marca { get; set; }
        public string Modelo { get; set; }
        public string Color { get; set; }
        public int Año { get; set; }
        public double Kilometraje { get; set; }

        // Métodos comunes a todos los automóviles
        public void Encender()
        {
            Console.WriteLine("El automóvil se ha encendido");
        }

        public void Apagar()
        {
            Console.WriteLine("El automóvil se ha apagado");
        }

        public void Acelerar()
        {
            Console.WriteLine("El automóvil ha acelerado");
        }

        public void Frenar()
        {
            Console.WriteLine("El automóvil ha frenado");
        }

        // Método abstracto que debe ser definido por las clases derivadas
        public abstract void MostrarInformacion();
    }

    // Clase concreta Deportivo que hereda de Automovil
    public class Deportivo : Automovil
    {
        // Propiedades específicas de los deportivos
        public int VelocidadMaxima { get; set; }
        public string TipoDeMotor { get; set; }
        public int NumeroDePuertas { get; set; }

        // Métodos específicos de los deportivos
        public void Turbo()
        {
            Console.WriteLine("El deportivo ha activado el turbo");
        }

        public void Drift()
        {
            Console.WriteLine("El deportivo ha hecho un drift");
        }

        // Método abstracto que se define en esta clase
        public override void MostrarInformacion()
        {
            Console.WriteLine($"Este es un deportivo de marca {Marca}, modelo {Modelo}, color {Color}, año {Año}, kilometraje {Kilometraje}, velocidad máxima {VelocidadMaxima}, tipo de motor {TipoDeMotor} y número de puertas {NumeroDePuertas}");
        }
    }

    // Creación de un objeto de la clase Deportivo
    Deportivo miDeportivo = new Deportivo();
    miDeportivo.Marca = "Ferrari";
    miDeportivo.Modelo = "F8 Spider";
    miDeportivo.Color = "Rojo";
    miDeportivo.Año = 2023;
    miDeportivo.Kilometraje = 0;
    miDeportivo.VelocidadMaxima = 340;
    miDeportivo.TipoDeMotor = "V8";
    miDeportivo.NumeroDePuertas = 2;

    // Invocación de los métodos heredados de la clase Automovil
    miDeportivo.Encender();
    miDeportivo.Apagar();
    miDeportivo.Acelerar();
    miDeportivo.Frenar();

    // Invocación de los métodos propios de la clase Deportivo
    miDeportivo.Turbo();
    miDeportivo.Drift();

    // Invocación del método abstracto definido en la clase Deportivo
    miDeportivo.MostrarInformacion();

Loading