Implementieren Sie explizite Schnittstellenmember in einer Klasse

Abgeschlossen

In C# ermöglicht die explizite Schnittstellenimplementierung, dass eine Klasse Schnittstellenmitglieder so implementiert, dass auf sie nur über die Schnittstelle und nicht über die Klasseninstanz zugegriffen werden kann. Dies ist nützlich, wenn eine Klasse mehrere Schnittstellen mit Membern implementiert, die dieselbe Signatur aufweisen.

Mehrere Schnittstellen in einer Klasse

Eine Klasse in C# kann mehrere Schnittstellen implementieren, sodass sie das Verhalten von verschiedenen Quellen erben kann. Die Möglichkeit, mehrere Schnittstellen zu kombinieren, ist von entscheidender Bedeutung, da C# keine mehrfache Vererbung von Klassen unterstützt. Durch die Implementierung mehrerer Schnittstellen kann eine Klasse unterschiedliche Features aufweisen und stellt sicher, dass sie den von diesen Schnittstellen festgelegten Regeln folgt.

  • Schnittstellen definieren eine Gruppe verwandter Funktionen.
  • Eine Klasse oder Struktur muss alle Elemente der von ihr erbenen Schnittstellen implementieren.
  • Schnittstellen können Methoden, Eigenschaften, Ereignisse und Indexer enthalten.

Hier sind zwei einfache Schnittstellen für unser Beispiel:

public interface IEnglishDimensions
{
    float Length();
    float Width();
}

public interface IMetricDimensions
{
    float Length();
    float Width();
}

Explizite Schnittstellenmitglieder

In C# kann eine Klasse nur von einer Klasse erben, aber mehrere Schnittstellen implementieren. Dies ist besonders wichtig, wenn mehrere Schnittstellen über dieselben Membernamen verfügen. Um Verwirrung zu vermeiden, verwenden wir die explizite Schnittstellenimplementierung.

Die explizite Schnittstellenimplementierung stellt sicher, dass jedes Mitglied einer Schnittstelle über eine eindeutige Implementierung verfügt und Konflikte verhindert. Außerdem wird klargestellt, zu welcher Schnittstelle ein Element gehört, wenn eine Klasse zwei oder mehr Schnittstellen mit denselben Membernamen implementiert. Die explizite Schnittstellenimplementierung ermöglicht es einer Klasse, die Anforderungen mehrerer Schnittstellen zu erfüllen und vielfältige Funktionen bereitzustellen.

Um ein Mitglied einer Schnittstelle explizit zu implementieren, fügen Sie den Schnittstellennamen und einen Punkt vor dem Mitgliedsnamen hinzu. Ein Beispiel:

public class Box : IEnglishDimensions, IMetricDimensions
{
    float IEnglishDimensions.Length()
    {
        return 30.0f;
    }

    float IEnglishDimensions.Width()
    {
        return 20.0f;
    }

    float IMetricDimensions.Length()
    {
        return 76.2f;
    }

    float IMetricDimensions.Width()
    {
        return 50.8f;
    }
}

In diesem Code implementiert die Box Klasse zwei Schnittstellen: IEnglishDimensions und IMetricDimensions. Beide Schnittstellen haben Mitglieder mit den Namen Length und Width. Um Verwirrung zu vermeiden, wird jedes Element explizit mit seiner Schnittstelle verknüpft.

Hinweis

Explizit implementierte Schnittstellenmber verfügen nicht über Zugriffsmodifizierer wie public, privateusw. Sie können nur über eine Instanz der Schnittstelle und nicht über die Klasse zugegriffen werden. Dies bedeutet, dass Sie Box.Length() nicht aufrufen können, aber Sie können IEnglishDimensions.Length() aufrufen, wenn Sie eine Instanz von Box haben, die als IEnglishDimensions behandelt wird.

Verwenden von expliziten Schnittstellenmitgliedern

Sie müssen Instanzen der Schnittstellen erstellen und deren Member aufrufen, um ihren Code auszuführen und zu testen, der explizite Schnittstellenmitglieder verwendet. Dadurch wird sichergestellt, dass die richtige Implementierung basierend auf dem Schnittstellentyp aufgerufen wird.

Box box = new Box();
IEnglishDimensions eDimensions = box;
IMetricDimensions mDimensions = box;

Console.WriteLine($"Length in inches: {eDimensions.Length()}");
Console.WriteLine($"Width in inches: {eDimensions.Width()}");
Console.WriteLine($"Length in centimeters: {mDimensions.Length()}");
Console.WriteLine($"Width in centimeters: {mDimensions.Width()}");

In diesem Beispiel wird die Box-Klasseninstanz in beide IEnglishDimensions und IMetricDimensions umgewandelt, um auf die expliziten Schnittstellenmitglieder zuzugreifen. Die Ausgabe zeigt die Abmessungen sowohl in Englisch als auch in Metrikeinheiten an.

Length in inches: 30
Width in inches: 20
Length in centimeters: 76.2
Width in centimeters: 50.8

In C# können Sie mehrere Schnittstellen in einer Klasse implementieren, indem Sie explizite Schnittstellenimplementierung verwenden, um Namenskonflikte zu lösen, wenn Mitglieder über dieselben Signaturen verfügen. Explizit implementierte Member werden über die Schnittstelleninstanz aufgerufen, nicht über die Klasseninstanz, um die ordnungsgemäße Funktionalität sicherzustellen und Mehrdeutigkeit zu vermeiden. Dieser Ansatz verbessert die Codeerhaltbarkeit, indem das beabsichtigte Verhalten für jede Schnittstelle klar definiert wird, wodurch die Codebasis einfacher zu verstehen und zu erweitern ist.