Explicitní implementace rozhraní (Příručka programování C#)
Pokud třídy implementuje dvě rozhraní, které obsahují člen se stejným podpisem pak provádění člena na třídě způsobí obou rozhraní použít člena jako jejich provádění.Příklad:
class Test
{
static void Main()
{
SampleClass sc = new SampleClass();
IControl ctrl = (IControl)sc;
ISurface srfc = (ISurface)sc;
// The following lines all call the same method.
sc.Paint();
ctrl.Paint();
srfc.Paint();
}
}
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
Console.WriteLine("Paint method in SampleClass");
}
}
// Output:
// Paint method in SampleClass
// Paint method in SampleClass
// Paint method in SampleClass
Pokud dva rozhraní členy provést stejnou funkci, ale to může vést k nesprávné provádění jednoho nebo obou rozhraních.Je možné implementovat jako člen rozhraní explicitně – vytváření třídy členu, který se nazývá pouze prostřednictvím rozhraní a je specifické pro dané rozhraní.To lze provést pojmenování člen třídy s názvem rozhraní a období.Příklad:
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
Člen třídy IControl.Paint jsou k dispozici pouze IControl rozhraní, a ISurface.Paint jsou k dispozici pouze ISurface.Obě metody implementace jsou oddělené a ani je k dispozici přímo na třídu.Příklad:
// Call the Paint methods from Main.
SampleClass obj = new SampleClass();
//obj.Paint(); // Compiler error.
IControl c = (IControl)obj;
c.Paint(); // Calls IControl.Paint on SampleClass.
ISurface s = (ISurface)obj;
s.Paint(); // Calls ISurface.Paint on SampleClass.
// Output:
// IControl.Paint
// ISurface.Paint
Explicitní implementace slouží také k vyřešení případů, kdy dvě rozhraní deklarovat různých členů stejný název jako vlastnosti a metody:
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}
Chcete-li implementovat obou rozhraní třídy má použít explicitní implementace p vlastnost nebo metoda p nebo obojí, aby nedošlo k chybě kompilátoru.Příklad:
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
Viz také
Referenční dokumentace
Třídy a struktur (Příručka programování C#)
Rozhraní (Příručka programování C#)
Dědičnost (Příručka programování C#)