En C#, una clase es una plantilla para crear objetos. Define las propiedades (datos) y métodos (comportamientos) que los objetos de esa clase tendrán. Un objeto es una instancia de una clase.
Ejemplo de clase:
public class Persona
{
// Propiedades
public string Nombre { get; set; }
public int Edad { get; set; }
// Método
public void Saludar()
{
Console.WriteLine($"Hola, mi nombre es {Nombre} y tengo {Edad} años.");
}
}
Creación de un objeto:
Persona persona = new Persona();
persona.Nombre = "Juan";
persona.Edad = 30;
persona.Saludar(); // Salida: Hola, mi nombre es Juan y tengo 30 años.
El encapsulamiento se refiere a la ocultación de los detalles internos de un objeto y la exposición solo de lo necesario. En C#, esto se logra mediante modificadores de acceso como public
, private
, protected
, y internal
.
Ejemplo de encapsulamiento:
public class CuentaBancaria
{
// Propiedad privada
private double saldo;
// Método público para depositar dinero
public void Depositar(double cantidad)
{
if (cantidad > 0)
{
saldo += cantidad;
}
}
// Método público para obtener el saldo
public double ObtenerSaldo()
{
return saldo;
}
}
La herencia permite crear una nueva clase que reutiliza, extiende y modifica el comportamiento de otra clase. La clase que hereda se llama subclase o clase derivada, y la clase de la cual hereda se llama superclase o clase base.
Ejemplo de herencia:
public class Animal
{
public void Comer()
{
Console.WriteLine("El animal está comiendo.");
}
}
public class Perro : Animal
{
public void Ladrar()
{
Console.WriteLine("El perro está ladrando.");
}
}
Uso de la herencia:
Perro miPerro = new Perro();
miPerro.Comer(); // Salida: El animal está comiendo.
miPerro.Ladrar(); // Salida: El perro está ladrando.
El polimorfismo permite tratar objetos de diferentes clases de una manera uniforme. En C#, el polimorfismo se logra principalmente mediante la herencia y las interfaces.
Ejemplo de polimorfismo con herencia:
public class Vehiculo
{
public virtual void Moverse()
{
Console.WriteLine("El vehículo se está moviendo.");
}
}
public class Coche : Vehiculo
{
public override void Moverse()
{
Console.WriteLine("El coche se está moviendo.");
}
}
public class Bicicleta : Vehiculo
{
public override void Moverse()
{
Console.WriteLine("La bicicleta se está moviendo.");
}
}
public class Programa
{
public static void Main()
{
Vehiculo miVehiculo = new Coche();
miVehiculo.Moverse(); // Salida: El coche se está moviendo.
miVehiculo = new Bicicleta();
miVehiculo.Moverse(); // Salida: La bicicleta se está moviendo.
}
}
La abstracción consiste en simplificar la complejidad mediante la ocultación de detalles innecesarios, exponiendo solo la funcionalidad esencial. En C#, las clases abstractas y las interfaces se utilizan para lograr la abstracción.
Ejemplo de clase abstracta:
public abstract class Figura
{
public abstract double CalcularArea();
}
public class Circulo : Figura
{
public double Radio { get; set; }
public Circulo(double radio)
{
Radio = radio;
}
public override double CalcularArea()
{
return Math.PI * Radio * Radio;
}
}
public class Rectangulo : Figura
{
public double Ancho { get; set; }
public double Alto { get; set; }
public Rectangulo(double ancho, double alto)
{
Ancho = ancho;
Alto = alto;
}
public override double CalcularArea()
{
return Ancho * Alto;
}
}
Uso de la abstracción:
public class Programa
{
public static void Main()
{
Figura miCirculo = new Circulo(5);
Console.WriteLine($"Área del círculo: {miCirculo.CalcularArea()}");
Figura miRectangulo = new Rectangulo(4, 6);
Console.WriteLine($"Área del rectángulo: {miRectangulo.CalcularArea()}");
}
}
Una interfaz define un contrato que las clases deben cumplir. No proporciona implementación, solo define los métodos y propiedades que deben ser implementados.
Ejemplo de interfaz:
public interface IMovible
{
void Mover();
}
public class Avion : IMovible
{
public void Mover()
{
Console.WriteLine("El avión está volando.");
}
}
public class Barco : IMovible
{
public void Mover()
{
Console.WriteLine("El barco está navegando.");
}
}
Uso de interfaces:
public class Programa
{
public static void Main()
{
IMovible miAvion = new Avion();
miAvion.Mover(); // Salida: El avión está volando.
IMovible miBarco = new Barco();
miBarco.Mover(); // Salida: El barco está navegando.
}
}
1. Modularidad: Los programas se pueden dividir en objetos individuales, facilitando la gestión y el mantenimiento.
2. Reutilización: Las clases y los objetos se pueden reutilizar en diferentes programas.
3. Flexibilidad: Es fácil añadir nuevas funcionalidades sin modificar el código existente.
4. Facilidad de Mantenimiento: La organización del código en objetos hace que el software sea más fácil de mantener y actualizar.
La Programación Orientada a Objetos es un pilar esencial en el desarrollo de software moderno y C# proporciona un sólido soporte para este paradigma. Comprender y aplicar los conceptos de la POO como clases, objetos, herencia, encapsulamiento, polimorfismo y abstracción es crucial para escribir código eficiente, modular y mantenible en C#. Al dominar estos conceptos, los desarrolladores pueden crear aplicaciones más robustas y escalables.
Jorge García
Fullstack developer