CSharp: Programación Orientada a Objetos

Descubre los fundamentos de la programación orientada a objetos en C# y domina conceptos clave como clases, herencia y polimorfismo.

Aprende CSharp GRATIS y certifícate

Programación Orientada a Objetos en C#

La programación orientada a objetos (POO) representa un paradigma fundamental en el desarrollo de software moderno, especialmente relevante en C#. Este enfoque permite modelar problemas del mundo real mediante la creación de entidades que encapsulan tanto datos como comportamientos, proporcionando una base sólida para construir aplicaciones robustas y mantenibles.

Fundamentos conceptuales

En C#, todo gira en torno a los objetos. Un objeto es una instancia de una clase que combina propiedades (datos) y métodos (comportamientos) en una sola unidad cohesiva. Esta aproximación facilita la organización del código y mejora significativamente la reutilización de componentes.

Las clases actúan como plantillas o moldes que definen la estructura y comportamiento que tendrán los objetos creados a partir de ellas. Cuando declaramos una clase en C#, estamos estableciendo un nuevo tipo de dato personalizado que puede incluir campos, propiedades, métodos y eventos.

public class Vehiculo
{
    public string Marca { get; set; }
    public string Modelo { get; set; }
    public int Año { get; set; }
    
    public void Acelerar()
    {
        Console.WriteLine($"El {Marca} {Modelo} está acelerando");
    }
}

Pilares fundamentales

La programación orientada a objetos en C# se sustenta sobre cuatro pilares fundamentales que proporcionan estructura y flexibilidad al código.

Encapsulación

La encapsulación permite ocultar los detalles internos de implementación y exponer únicamente las interfaces necesarias. En C#, esto se logra mediante modificadores de acceso que controlan la visibilidad de los miembros de una clase.

public class CuentaBancaria
{
    private decimal saldo; // Campo privado
    
    public decimal Saldo 
    { 
        get { return saldo; } 
        private set { saldo = value; } 
    }
    
    public void Depositar(decimal cantidad)
    {
        if (cantidad > 0)
            saldo += cantidad;
    }
}

Herencia

La herencia establece relaciones jerárquicas entre clases, permitiendo que una clase derive características de otra. La clase base proporciona funcionalidad común, mientras que las clases derivadas pueden especializar o extender este comportamiento.

public class Animal
{
    public string Nombre { get; set; }
    
    public virtual void HacerSonido()
    {
        Console.WriteLine("El animal hace un sonido");
    }
}

public class Perro : Animal
{
    public override void HacerSonido()
    {
        Console.WriteLine($"{Nombre} ladra: ¡Guau!");
    }
}

Polimorfismo

El polimorfismo permite que objetos de diferentes tipos respondan de manera específica a la misma interfaz. En C#, esto se implementa principalmente através de métodos virtuales, sobrescritura y interfaces.

Animal[] animales = { new Perro(), new Gato(), new Pajaro() };

foreach (Animal animal in animales)
{
    animal.HacerSonido(); // Cada animal hace su sonido específico
}

Abstracción

La abstracción se centra en definir contratos y comportamientos esenciales sin especificar los detalles de implementación. Las clases abstractas y las interfaces son las herramientas principales para lograr este objetivo.

public abstract class Forma
{
    public abstract double CalcularArea();
    
    public void MostrarInformacion()
    {
        Console.WriteLine($"Área: {CalcularArea()}");
    }
}

Construcción de objetos

Los constructores son métodos especiales que se ejecutan automáticamente cuando se crea una instancia de una clase. Permiten inicializar el estado del objeto de manera controlada y garantizar que se cumplan las condiciones necesarias desde el momento de la creación.

public class Producto
{
    public string Nombre { get; set; }
    public decimal Precio { get; set; }
    
    public Producto(string nombre, decimal precio)
    {
        Nombre = nombre;
        Precio = precio > 0 ? precio : throw new ArgumentException("El precio debe ser positivo");
    }
}

Propiedades y campos

Las propiedades en C# proporcionan un mecanismo elegante para acceder y modificar los datos de un objeto manteniendo el control sobre cómo se realizan estas operaciones. Ofrecen mayor flexibilidad que los campos públicos directos.

public class Temperatura
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set 
        { 
            if (value >= -273.15)
                celsius = value;
            else
                throw new ArgumentException("Temperatura por debajo del cero absoluto");
        }
    }
    
    public double Fahrenheit => celsius * 9/5 + 32;
}

Interfaces y contratos

Las interfaces definen contratos que las clases deben cumplir, especificando qué métodos y propiedades deben implementar sin dictar cómo hacerlo. Esto facilita el desacoplamiento y mejora la testabilidad del código.

public interface ICalculadora
{
    double Sumar(double a, double b);
    double Restar(double a, double b);
}

public class CalculadoraCientifica : ICalculadora
{
    public double Sumar(double a, double b) => a + b;
    public double Restar(double a, double b) => a - b;
    
    public double Potencia(double baseNum, double exponente) => Math.Pow(baseNum, exponente);
}

La programación orientada a objetos en C# proporciona las herramientas necesarias para crear arquitecturas sólidas y escalables. La comprensión profunda de estos conceptos fundamentales permite desarrollar aplicaciones que no solo funcionan correctamente, sino que también son fáciles de mantener, extender y modificar a lo largo del tiempo.

Empezar curso de CSharp

Lecciones de este módulo de CSharp

Lecciones de programación del módulo Programación Orientada a Objetos del curso de CSharp.

Ejercicios de programación en este módulo de CSharp

Evalúa tus conocimientos en Programación Orientada a Objetos con ejercicios de programación Programación Orientada a Objetos de tipo Test, Puzzle, Código y Proyecto con VSCode.