Sobes.tech
Middle

La question: Pentru ce sunt interfețele dacă deja există clase abstracte?

sobes.tech AI

Răspuns de la AI

  1. 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
    
  2. 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ă
        }
    }
    
  3. 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.
  4. 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.
  5. 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.