Middle
La question: Pentru ce sunt interfețele dacă deja există clase abstracte?
sobes.tech AI
Răspuns de la AI
- Moștenirea multiplă. O clasă poate implementa mai multe interfețe, dar poate moșteni doar de la o singură clasă (inclusiv abstracte).
interface IDrivable {} interface IFlyable {} class Car : IDrivable {} // Moștenește doar de la o clasă (implicit object) class FlyingCar : IDrivable, IFlyable {} // Implementă mai multe interfețe - Contract fără implementare. Interfețele definesc doar un contract (metode, proprietăți, evenimente, indexatori) fără nicio implementare. Clasele abstracte pot conține funcționalitate parțial implementată și câmpuri.
interface IShape { double GetArea(); // Doar declarație } abstract class Shape { public abstract double GetArea(); // Declarație public string Color { get; set; } // Implementare proprietate public void DisplayColor() { Console.WriteLine($"Culoare: {Color}"); // Metodă implementată } } - Cuplaj slab (loose coupling). Interfețele favorizează un cuplaj slab între componente, deoarece codul depinde de contract, nu de implementarea concretă a clasei. Acest lucru facilitează înlocuirea unei implementări cu alta.
- Separarea rolurilor. Interfețele permit definirea clară a rolurilor sau capacităților pe care trebuie să le aibă o clasă, indiferent de tipul său principal sau ierarhia de moștenire.
- Testare. Mock-urile și stubs pentru testare unitară sunt adesea create pe baza interfețelor, nu a claselor abstracte, deoarece acestea pot avea dependențe sau logică internă complexă.
Rezumat: interfețele oferă un mecanism flexibil pentru definirea contractelor și atingerea polimorfismului fără restricțiile moștenirii de la o singură clasă de bază, în timp ce clasele abstracte sunt destinate să ofere implementare parțială și funcționalitate de bază, care va fi completată în clasele derivate.