Sobes.tech
Middle

In welchen Fällen sollte man eine Schnittstelle und in welchen eine abstrakte Klasse verwenden?

sobes.tech KI

Antwort von AI

Verwenden Sie Schnittstellen, um Verhaltensverträge zu definieren, die Klassen implementieren können. Dies ermöglicht Polymorphismus und verringert die Kopplung zwischen Klassen. Eine Klasse kann mehrere Schnittstellen haben, aber nur eine Basisklasse.

Verwenden Sie abstrakte Klassen, wenn Sie eine gemeinsame Implementierung eines Teils der Funktionalität haben und eine Grundstruktur für abgeleitete Klassen bereitstellen möchten. Abstrakte Klassen können abstrakte und normale Methoden sowie Felder enthalten. Sie sind geeignet, wenn Vererbung "ist" erforderlich ist.

Merkmal Schnittstelle Abstrakte Klasse
Mehrfachvererbung Ja Nein
Implementierung Nein (bis .NET 8 mit Standard-Interface-Methoden) Ja, teilweise oder vollständig
Felder Nein Ja
Konstruktoren Nein Ja
Beziehungsart "kann machen" ("has-a") "ist" ("is-a")

Beispiel für die Verwendung einer Schnittstelle:

// Definieren eines Vertrags für Objekte, die fliegen können
public interface IFlyable
{
    void Fly();
}

// Die Flugzeugklasse implementiert die Schnittstelle IFlyable
public class Airplane : IFlyable
{
    public void Fly()
    {
        // Flugzeugflug-Implementierung
        Console.WriteLine("Das Flugzeug fliegt");
    }
}

// Die Vogelklasse implementiert ebenfalls die Schnittstelle IFlyable
public class Bird : IFlyable
{
    public void Fly()
    {
        // Vogel-Flug-Implementierung
        Console.WriteLine("Der Vogel fliegt");
    }
}

Beispiel für die Verwendung einer abstrakten Klasse:

// Abstrakte Klasse Tier mit allgemeiner Atem-Implementierung
public abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("Tier atmet");
    }

    // Abstrakte Methode, die von Unterklassen implementiert werden muss
    public abstract void MakeSound();
}

// Konkrete Klasse Hund, die von Animal erbt
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Wuff!");
    }
}

// Konkrete Klasse Katze, die von Animal erbt
public class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Miau!");
    }
}