Middle
A cosa servono le interfacce se esistono già le classi astratte?
sobes.tech AI
Risposta dell'AI
- 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 - 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 } } - 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.
- 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à.
- 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.