Sobes.tech
Middle

A cosa servono le interfacce se esistono già le classi astratte?

sobes.tech AI

Risposta dell'AI

  1. Ereditarietà multipla. Una classe può implementare più interfacce, ma ereditare solo da una classe (inclusi astratti).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Eredita solo da una classe (object implicitamente)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementa più interfacce
    
  2. Contratto senza implementazione. Le interfacce definiscono solo un contratto (metodi, proprietà, eventi, indicizzatori) senza alcuna implementazione. Le classi astratte possono contenere funzionalità parzialmente implementate e campi.
    interface IShape
    {
        double GetArea(); // Solo dichiarazione
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Dichiarazione
        public string Color { get; set; } // Implementazione della proprietà
    
        public void DisplayColor()
        {
            Console.WriteLine($"Colore: {Color}"); // Metodo implementato
        }
    }
    
  3. Accoppiamento debole (loose coupling). Le interfacce favoriscono un accoppiamento debole tra componenti, poiché il codice dipende dal contratto, non dall'implementazione concreta. Ciò facilita la sostituzione di un'implementazione con un'altra.
  4. Separazione dei ruoli. Le interfacce consentono di definire ruoli o capacità chiare che una classe deve possedere, indipendentemente dal suo tipo principale o gerarchia di ereditarietà.
  5. Test. I mock e gli stub per i test unitari sono spesso creati sulla base delle interfacce, non delle classi astratte, poiché queste possono avere dipendenze o logiche interne complesse.

Riassumendo: le interfacce forniscono un meccanismo flessibile per definire contratti e raggiungere il polimorfismo senza le restrizioni dell'ereditarietà da una singola classe base, mentre le classi astratte sono destinate a fornire implementazioni parziali e funzionalità di base, che saranno integrate nelle classi derivate.