Sobes.tech
Middle

Na co jsou rozhraní, pokud již existují abstraktní třídy?

sobes.tech AI

Odpověď od AI

  1. Vícenáslednictví. Třída může implementovat více rozhraní, ale dědit pouze od jedné třídy (včetně abstraktních).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Dědí pouze od jedné třídy (implicitně od object)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementuje více rozhraní
    
  2. Smlouva bez implementace. Rozhraní definují pouze smlouvu (metody, vlastnosti, události, indexery) bez jakékoliv implementace. Abstraktní třídy mohou obsahovat částečně implementovanou funkcionalitu a pole.
    interface IShape
    {
        double GetArea(); // Pouze deklarace
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Deklarace
        public string Color { get; set; } // Implementace vlastnosti
    
        public void DisplayColor()
        {
            Console.WriteLine($"Barva: {Color}"); // Implementovaná metoda
        }
    }
    
  3. Volné spojení (loose coupling). Rozhraní podporují volné spojení mezi komponentami, protože kód závisí na smlouvě, nikoliv na konkrétní implementaci třídy. To usnadňuje výměnu jedné implementace za jinou.
  4. Rozdělení rolí. Rozhraní umožňují definovat jasné role nebo schopnosti, které musí třída mít, bez ohledu na její hlavní typ nebo hierarchii dědičnosti.
  5. Testování. Mocky a stuby pro jednotkové testy jsou často vytvářeny na základě rozhraní, nikoliv abstraktních tříd, protože ty mohou mít závislosti nebo složitou interní logiku.

Shrnuto: rozhraní poskytují flexibilní mechanismus pro definování smluv a dosažení polymorfismu bez omezení dědičnosti od jedné základní třídy, zatímco abstraktní třídy jsou určeny k poskytování částečné implementace a základní funkcionality, kterou doplňují odvozené třídy.