Sobes.tech
Middle

¿En qué casos se debe usar una interfaz y en cuáles una clase abstracta?

sobes.tech AI

Respuesta de la IA

Utilice interfaces para definir contratos de comportamiento que las clases pueden implementar. Esto permite lograr polimorfismo y reduce el acoplamiento entre clases. Una clase puede tener múltiples interfaces, pero solo una clase base.

Utilice clases abstractas cuando tenga una implementación común de parte de la funcionalidad y desee proporcionar una estructura base para las clases derivadas. Las clases abstractas pueden contener métodos abstractos y normales, así como campos. Son apropiadas cuando se requiere herencia "es".

Característica Interfaz Clase abstracta
Herencia múltiple No
Implementación No (hasta .NET 8 con métodos de interfaz predeterminados) Sí, parcial o completa
Campos No
Constructores No
Tipo de relación "puede hacer" ("has-a") "es" ("is-a")

Ejemplo de uso de interfaz:

// Definimos un contrato para objetos que pueden volar
public interface IFlyable
{
    void Fly();
}

// La clase avión implementa la interfaz IFlyable
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Implementación del vuelo del avión
        Console.WriteLine("El avión vuela");
    }
}

// La clase pájaro también implementa la interfaz IFlyable
public class Bird : IFlyable
{
    public void Fly()
    {
        // Implementación del vuelo del pájaro
        Console.WriteLine("El pájaro vuela");
    }
}

Ejemplo de uso de clase abstracta:

// Clase abstracta Animal con implementación común de respiración
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("El animal respira");
    }

    // Método abstracto que deben implementar las clases derivadas
    public abstract void MakeSound();
}

// Clase concreta de perro que hereda de Animal
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("¡Guau!");
    }
}

// Clase concreta de gato que hereda de Animal
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("¡Miau!");
    }
}