Implementați membri de interfață explicită într-o clasă
În C#, implementarea explicită a interfeței permite unei clase să implementeze membrii interfeței într-un mod care să fie accesibil doar prin interfață, nu prin instanța clasei. Acest lucru este util atunci când o clasă implementează mai multe interfețe cu membrii care au aceeași semnătură.
Interfețe multiple într-o clasă
O clasă din C# poate implementa mai multe interfețe, permițându-i să moștenească comportamentul de la diverse surse. Capacitatea de a combina mai multe interfețe este crucială, deoarece C# nu acceptă moștenirea multiplă a claselor. Implementarea mai multor interfețe permite unei clase să aibă caracteristici diferite și asigură respectarea regulilor stabilite de aceste interfețe.
- Interfețele definesc un grup de funcționalități asociate.
- O clasă sau o structură trebuie să implementeze toți membrii interfețelor pe care le moștenește.
- Interfețele pot conține metode, proprietăți, evenimente și indexatoare.
Iată două interfețe simple, de exemplu:
public interface IEnglishDimensions
{
float Length();
float Width();
}
public interface IMetricDimensions
{
float Length();
float Width();
}
Membri expliciti ai interfeței
În C#, o clasă poate moșteni de la o singură clasă, dar poate implementa mai multe interfețe. Acest lucru este important mai ales atunci când mai multe interfețe au același nume de membri. Pentru a evita confuzia, utilizăm implementarea explicită a interfeței.
Implementarea explicită a interfeței asigură faptul că fiecare membru al unei interfețe are o implementare unică, împiedicând conflictele. De asemenea, clarifică interfața căreia îi aparține un membru atunci când o clasă implementează două sau mai multe interfețe cu aceleași nume de membri. Implementarea explicită a interfeței permite unei clase să îndeplinească cerințele mai multor interfețe, oferind diverse funcționalități.
Pentru a implementa în mod explicit un membru al unei interfețe, adăugați numele interfeței și un punct înaintea numelui membrului. Iată un exemplu:
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;
}
}
În acest cod, Box clasa implementează două interfețe: IEnglishDimensions și IMetricDimensions. Ambele interfețe au membri numiți Length și Width. Pentru a evita confuzia, fiecare membru este legat în mod explicit la interfața sa.
Notă
Membrii interfeței implementate explicit nu au modificatori de acces, cum ar fi public, private, etc. Acestea pot fi accesate doar printr-o instanță a interfeței, nu prin clasă. Acest lucru înseamnă că nu puteți apela Box.Length(), dar puteți apela IEnglishDimensions.Length() dacă aveți o instanță care Box este tratată ca .IEnglishDimensions
Utilizarea membrilor interfeței explicite
Trebuie să creați instanțe ale interfețelor și să le apelați membrii să execute și să testeze cod care utilizează membri de interfață explicită. Acest lucru asigură invocarea implementării corecte pe baza tipului de interfață.
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()}");
În acest exemplu, instanța clasei Box este difuzată atât IEnglishDimensions pentru cât și IMetricDimensions pentru a accesa membrii interfeței explicite. Rezultatul afișează dimensiunile atât în unități englezești, cât și în unități metrice.
Length in inches: 30
Width in inches: 20
Length in centimeters: 76.2
Width in centimeters: 50.8
În C#, puteți implementa mai multe interfețe într-o clasă, utilizând implementarea explicită a interfeței pentru a rezolva conflictele de denumire atunci când membrii au aceleași semnături. Membrii implementați explicit sunt accesați prin instanța de interfață, nu prin instanța de clasă, asigurând funcționalitatea corespunzătoare și evitând ambiguitatea. Această abordare îmbunătățește menținerea codului prin definirea clară a comportamentului dorit pentru fiecare interfață, făcând codul de bază mai ușor de înțeles și de extins.