Sobes.tech
Middle

Зашто су потребни интерфејси ако већ постоје апстрактне класе?

sobes.tech АИ

Одговор од АИ

  1. Višestruko nasleđivanje. Klasa može implementirati više interfejsa, ali nasleđuje samo od jedne klase (uključujući apstraktne).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Nasleđuje samo od jedne klase (objekat implicitno)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementira više interfejsa
    
  2. Ugovor bez implementacije. Interfejsi definišu samo ugovor (metode, svojstva, događaje, indeksatore) bez bilo kakve implementacije. Apstraktne klase mogu sadržavati delimično implementiranu funkcionalnost i polja.
    interface IShape
    {
        double GetArea(); // Samo deklaracija
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Deklaracija
        public string Color { get; set; } // Implementacija svojstva
    
        public void DisplayColor()
        {
            Console.WriteLine($"Boja: {Color}"); // Implementirana metoda
        }
    }
    
  3. Slaba povezanost (loose coupling). Interfejsi podstiču slabu povezanost između komponenti, jer kod zavisi od ugovora, a ne od konkretne implementacije klase. To olakšava zamenu jedne implementacije drugom.
  4. Razdvajanje uloga. Interfejsi omogućavaju definisanje jasnih uloga ili mogućnosti koje klasa mora posedovati, nezavisno od njenog osnovnog tipa ili hijerarhije nasleđivanja.
  5. Testiranje. Moke i stubovi za modularno testiranje često se kreiraju na osnovu interfejsa, a ne apstraktnih klasa, jer one mogu imati zavisnosti ili složenu internu logiku.

Sumarno: interfejsi pružaju fleksibilan mehanizam za definisanje ugovora i postizanje polimorfizma bez ograničenja nasleđivanja od jedne osnovne klase, dok su apstraktne klase namenjene za pružanje delimične implementacije i osnovne funkcionalnosti, koje će biti dopunjene u izvedenim klasama.