Implementer eksplicitte grænseflademedlemmer i en klasse

Fuldført

I C#giver eksplicit grænsefladeimplementering en klasse mulighed for at implementere grænseflademedlemmer på en måde, så de kun er tilgængelige via grænsefladen og ikke klasseforekomsten. Dette er nyttigt, når en klasse implementerer flere grænseflader med medlemmer, der har samme signatur.

Flere grænseflader i en klasse

En klasse i C# kan implementere flere grænseflader, så den kan nedarve funktionsmåde fra forskellige kilder. Muligheden for at kombinere flere grænseflader er afgørende, fordi C# ikke understøtter flere nedarvning af klasser. Implementering af flere grænseflader gør det muligt for en klasse at have forskellige funktioner og sikrer, at den følger de regler, der er angivet af disse grænseflader.

  • Grænseflader definerer en gruppe relaterede funktioner.
  • En klasse eller struktur skal implementere alle medlemmer af de grænseflader, den nedarver.
  • Grænseflader kan indeholde metoder, egenskaber, hændelser og indeksering.

Her er to enkle grænseflader til vores eksempel:

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

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

Medlemmer af eksplicit grænseflade

I C#kan en klasse kun nedarve fra én klasse, men kan implementere flere grænseflader. Dette er især vigtigt, når flere grænseflader har de samme medlemsnavne. For at undgå forvirring bruger vi eksplicit grænsefladeimplementering.

Eksplicit grænsefladeimplementering sikrer, at hvert medlem af en grænseflade har en entydig implementering, der forhindrer konflikter. Den tydeliggør også, hvilken grænseflade et medlem tilhører, når en klasse implementerer to eller flere grænseflader med de samme medlemsnavne. Eksplicit grænsefladeimplementering gør det muligt for en klasse at opfylde kravene til flere grænseflader, hvilket giver forskellige funktioner.

Hvis du vil implementere et medlem af en grænseflade eksplicit, skal du tilføje grænsefladenavnet og et punktum før medlemsnavnet. Her er et eksempel:

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;
    }
}

I denne kode Box implementerer klassen to grænseflader: IEnglishDimensions og IMetricDimensions. Begge grænseflader har medlemmer med navnet Length og Width. For at undgå forvirring er hvert medlem eksplicit knyttet til grænsefladen.

Bemærk

Medlemmer af grænsefladen, der eksplicit er implementeret, har ikke adgangsmodifikatorer som public, privateosv. Der kan kun opnås adgang til dem via en forekomst af grænsefladen og ikke klassen. Det betyder, at du ikke kan kalde Box.Length(), men du kan ringe op IEnglishDimensions.Length() , hvis du har en forekomst af Box , der behandles som en IEnglishDimensions.

Brug eksplicitte grænseflademedlemmer

Du skal oprette forekomster af grænsefladerne og kalde deres medlemmer for at udføre og teste kode, der bruger eksplicitte grænseflademedlemmer. Dette sikrer, at den korrekte implementering aktiveres baseret på grænsefladetypen.

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()}");

I dette eksempel sendes klasseforekomsten Box til både IEnglishDimensions og IMetricDimensions for at få adgang til medlemmerne af den eksplicitte grænseflade. Outputtet viser dimensionerne på både engelsk og metrisk enhed.

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

I C#kan du implementere flere grænseflader i en klasse ved hjælp af eksplicit grænsefladeimplementering for at løse navnekonflikter, når medlemmer har de samme signaturer. Eksplicit implementerede medlemmer tilgås via grænsefladeforekomsten, ikke klasseforekomsten, der sikrer korrekt funktionalitet og undgår flertydighed. Denne fremgangsmåde forbedrer vedligeholdelsen af kode ved tydeligt at definere den tilsigtede funktionsmåde for hver grænseflade, hvilket gør kodebasen nemmere at forstå og udvide.