Implementace explicitních členů rozhraní ve třídě
V jazyce C# explicitní implementace rozhraní umožňuje třídě implementovat členy rozhraní způsobem, který jsou přístupné pouze prostřednictvím rozhraní, nikoli instance třídy. To je užitečné, když třída implementuje více rozhraní se členy, kteří mají stejný podpis.
Více rozhraní ve třídě
Třída v jazyce C# může implementovat více rozhraní, což umožňuje dědit chování z různých zdrojů. Schopnost kombinovat více rozhraní je zásadní, protože jazyk C# nepodporuje více dědičnosti tříd. Implementace více rozhraní umožňuje třídě mít různé funkce a zajišťuje, že dodržuje pravidla nastavená těmito rozhraními.
- Rozhraní definují skupinu souvisejících funkcí.
- Třída nebo struktura musí implementovat všechny členy rozhraní, která dědí.
- Rozhraní mohou obsahovat metody, vlastnosti, události a indexery.
Tady jsou dvě jednoduchá rozhraní pro náš příklad:
public interface IEnglishDimensions
{
float Length();
float Width();
}
public interface IMetricDimensions
{
float Length();
float Width();
}
Explicitní členy rozhraní
V jazyce C# může třída dědit pouze z jedné třídy, ale může implementovat více rozhraní. To je zvlášť důležité, když několik rozhraní má stejné názvy členů. Abychom se vyhnuli nejasnostem, použijeme explicitní implementaci rozhraní.
Explicitní implementace rozhraní zajišťuje, že každý člen rozhraní má jedinečnou implementaci, což brání konfliktům. Vysvětluje také, do kterého rozhraní člen patří, když třída implementuje dvě nebo více rozhraní se stejnými názvy členů. Explicitní implementace rozhraní umožňuje třídě splnit požadavky více rozhraní, které poskytují různé funkce.
Pokud chcete explicitně implementovat člena rozhraní, přidejte název rozhraní a tečku před název člena. Tady je příklad:
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;
}
}
V tomto kódu Box třída implementuje dvě rozhraní: IEnglishDimensions a IMetricDimensions. Obě rozhraní mají členy pojmenované Length a Width. Aby nedocházelo k nejasnostem, každý člen je explicitně propojený s jeho rozhraním.
Poznámka:
Explicitně implementované členy rozhraní nemají modifikátory přístupu, jako je public, privateatd. K nim lze přistupovat pouze prostřednictvím instance rozhraní, nikoli třídy. To znamená, že nemůžete volat Box.Length(), ale můžete volat IEnglishDimensions.Length(), pokud máte instanci Box, která je považována za IEnglishDimensions.
Použijte explicitní členy rozhraní
Potřebujete vytvořit instance rozhraní a volat jejich členy, aby provedli a otestovali kód, který využívá explicitní členy rozhraní. Tím se zajistí, že se na základě typu rozhraní vyvolá správná implementace.
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()}");
V tomto příkladu je instance třídy Box přetypována na typy obou IEnglishDimensions a IMetricDimensions pro získání přístupu k explicitním členům rozhraní. Výstup zobrazí rozměry v jednotkách angličtiny i metriky.
Length in inches: 30
Width in inches: 20
Length in centimeters: 76.2
Width in centimeters: 50.8
V jazyce C# můžete implementovat více rozhraní ve třídě pomocí explicitní implementace rozhraní k řešení konfliktů pojmenování, pokud mají členové stejné podpisy. Explicitně implementované členy jsou přístupné prostřednictvím instance rozhraní, nikoli instance třídy, zajištění správné funkčnosti a zabránění nejednoznačnosti. Tento přístup zlepšuje udržovatelnost kódu tím, že jasně definuje zamýšlené chování pro každé rozhraní, což usnadňuje pochopení a rozšíření základu kódu.