Sobes.tech
Middle

In quali casi si dovrebbe usare un'interfaccia e in quali una classe astratta?

sobes.tech AI

Risposta dell'AI

Utilizza le interfacce per definire il contratto di comportamento che le classi possono implementare. Questo permette di raggiungere il polimorfismo e di ridurre l'accoppiamento tra le classi. Una classe può avere più interfacce, ma solo una classe base.

Utilizza le classi astratte quando hai un'implementazione comune di parte della funzionalità e vuoi fornire una struttura di base per le classi derivate. Le classi astratte possono contenere metodi astratti e normali, oltre a campi. Sono adatte quando è richiesta l'ereditarietà "è".

Caratteristica Interfaccia Classe astratta
Eredità multipla No
Implementazione No (fino a .NET 8 con metodi di interfaccia predefiniti) Sì, parziale o completa
Campi No
Costruttori No
Tipo di relazione "può fare" ("has-a") "è" ("is-a")

Esempio di utilizzo di interfaccia:

// Definiamo un contratto per gli oggetti che possono volare
public interface IFlyable
{
    void Fly();
}

// La classe aereo implementa l'interfaccia IFlyable
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Implementazione del volo dell'aereo
        Console.WriteLine("L'aereo vola");
    }
}

// La classe uccello implementa anche l'interfaccia IFlyable
public class Bird : IFlyable
{
    public void Fly()
    {
        // Implementazione del volo dell'uccello
        Console.WriteLine("L'uccello vola");
    }
}

Esempio di utilizzo di classe astratta:

// Classe astratta Animal con implementazione comune della respirazione
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("L'animale respira");
    }

    // Metodo astratto che deve essere implementato dalle classi derivate
    public abstract void MakeSound();
}

// Classe concreta di cane che eredita da Animal
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bau!");
    }
}

// Classe concreta di gatto che eredita da Animal
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Miao!");
    }
}