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 | Sì | No |
| Implementazione | No (fino a .NET 8 con metodi di interfaccia predefiniti) | Sì, parziale o completa |
| Campi | No | Sì |
| Costruttori | No | Sì |
| 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!");
}
}