Sobes.tech
Middle

Wozu dienen Schnittstellen, wenn bereits abstrakte Klassen existieren?

sobes.tech KI

Antwort von AI

  1. Mehrfachvererbung. Eine Klasse kann mehrere Schnittstellen implementieren, aber nur von einer Klasse erben (einschließlich abstrakter).
    interface IDrivable {}
    interface IFlyable {}
    
    class Car : IDrivable {} // Erbt nur von einer Klasse (object implizit)
    
    class FlyingCar : IDrivable, IFlyable {} // Implementiert mehrere Schnittstellen
    
  2. Vertrag ohne Implementierung. Schnittstellen definieren nur einen Vertrag (Methoden, Eigenschaften, Ereignisse, Indexer) ohne jegliche Implementierung. Abstrakte Klassen können teilweise implementierte Funktionalitäten und Felder enthalten.
    interface IShape
    {
        double GetArea(); // Nur Deklaration
    }
    
    abstract class Shape
    {
        public abstract double GetArea(); // Deklaration
        public string Color { get; set; } // Implementierung der Eigenschaft
    
        public void DisplayColor()
        {
            Console.WriteLine($"Farbe: {Color}"); // Implementierte Methode
        }
    }
    
  3. Lose Kopplung (loose coupling). Schnittstellen fördern eine lose Kopplung zwischen Komponenten, da der Code vom Vertrag abhängt, nicht von der konkreten Implementierung. Das erleichtert den Austausch einer Implementierung durch eine andere.
  4. Rollenaufteilung. Schnittstellen ermöglichen die Definition klarer Rollen oder Fähigkeiten, die eine Klasse besitzen muss, unabhängig von ihrem Basistyp oder ihrer Vererbungs-Hierarchie.
  5. Testen. Mock-Objekte und Stubs für Unit-Tests werden häufig auf Schnittstellenbasis erstellt, nicht auf abstrakten Klassen, da diese Abhängigkeiten oder komplexe interne Logik haben können.

Zusammenfassend: Schnittstellen bieten einen flexiblen Mechanismus zur Definition von Verträgen und zur Erreichung von Polymorphismus ohne die Einschränkungen der Vererbung von einer einzigen Basisklasse, während abstrakte Klassen dazu dienen, teilweise Implementierungen und grundlegende Funktionalitäten bereitzustellen, die in abgeleiteten Klassen ergänzt werden.