Sobes.tech
Middle

Waarvoor dienen interfaces als er al abstracte klassen bestaan?

sobes.tech AI

Antwoord van AI

  1. Meervoudige overerving. Een klasse kan meerdere interfaces implementeren, maar erft slechts van één klasse (inclusief abstracte).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Erft slechts van één klasse (object impliciet)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementeert meerdere interfaces
    
  2. Contract zonder implementatie. Interfaces definiëren alleen een contract (methoden, eigenschappen, gebeurtenissen, indexers) zonder enige implementatie. Abstracte klassen kunnen gedeeltelijk geïmplementeerde functionaliteit en velden bevatten.
    interface IShape
    {
        double GetArea(); // Alleen declaratie
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Declaratie
        public string Color { get; set; } // Implementatie van eigenschap
    
        public void DisplayColor()
        {
            Console.WriteLine($"Kleur: {Color}"); // Geïmplementeerde methode
        }
    }
    
  3. Losse koppeling (loose coupling). Interfaces bevorderen losse koppeling tussen componenten, omdat de code afhankelijk is van het contract, niet van de concrete implementatie van de klasse. Dit vergemakkelijkt het vervangen van één implementatie door een andere.
  4. Rolverdeling. Interfaces maken het mogelijk om duidelijke rollen of mogelijkheden te definiëren die een klasse moet bezitten, ongeacht het hoofdtype of de erfhiërarchie.
  5. Testen. Mocks en stubs voor unit testing worden vaak op basis van interfaces gemaakt, niet op basis van abstracte klassen, omdat deze afhankelijkheden of complexe interne logica kunnen hebben.

Samenvattend: interfaces bieden een flexibel mechanisme voor het definiëren van contracten en het bereiken van polymorfisme zonder de beperkingen van erfelijkheid van één basisklasse, terwijl abstracte klassen bedoeld zijn om gedeeltelijke implementatie en basisfunctionaliteit te bieden, die in afgeleide klassen wordt aangevuld.