Implementacja interfejsu jawnego (Przewodnik programowania w języku C#)

Jeśli klasa implementuje dwa interfejsy, które zawierają element członkowski z tym samym podpisem, implementacja tego elementu członkowskiego w klasie spowoduje użycie obu interfejsów jako ich implementacji. W poniższym przykładzie wszystkie wywołania wywołujące Paint tę samą metodę. Ten pierwszy przykład definiuje typy:

public interface IControl
{
    void Paint();
}
public interface ISurface
{
    void Paint();
}
public class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method.
    public void Paint()
    {
        Console.WriteLine("Paint method in SampleClass");
    }
}

Poniższy przykład wywołuje metody:

SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;

// The following lines all call the same method.
sample.Paint();
control.Paint();
surface.Paint();

// Output:
// Paint method in SampleClass
// Paint method in SampleClass
// Paint method in SampleClass

Może jednak nie być konieczne wywołanie tej samej implementacji dla obu interfejsów. Aby wywołać inną implementację w zależności od używanego interfejsu, można jawnie zaimplementować element członkowski interfejsu. Jawna implementacja interfejsu to składowa klasy wywoływana tylko za pośrednictwem określonego interfejsu. Nazwij składową klasy, prefiksując ją nazwą interfejsu i kropką. Na przykład:

public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

Składowa IControl.Paint klasy jest dostępna tylko za pośrednictwem interfejsu IControl i ISurface.Paint jest dostępna tylko za pośrednictwem ISurfaceelementu . Obie implementacje metod są oddzielne i żadna z nich nie jest dostępna bezpośrednio w klasie . Na przykład:

SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;

// The following lines all call the same method.
//sample.Paint(); // Compiler error.
control.Paint();  // Calls IControl.Paint on SampleClass.
surface.Paint();  // Calls ISurface.Paint on SampleClass.

// Output:
// IControl.Paint
// ISurface.Paint

Jawna implementacja służy również do rozwiązywania przypadków, w których dwa interfejsy deklarują różne elementy członkowskie tej samej nazwy, takie jak właściwość i metoda. Aby zaimplementować oba interfejsy, klasa musi używać jawnej implementacji dla właściwości P, lub metody Plub obu, aby uniknąć błędu kompilatora. Na przykład:

interface ILeft
{
    int P { get;}
}
interface IRight
{
    int P();
}

class Middle : ILeft, IRight
{
    public int P() { return 0; }
    int ILeft.P { get { return 0; } }
}

Implementacja jawnego interfejsu nie ma modyfikatora dostępu, ponieważ nie jest dostępna jako element członkowski typu, w który jest zdefiniowany. Zamiast tego jest dostępny tylko wtedy, gdy jest wywoływany za pośrednictwem wystąpienia interfejsu. Jeśli określisz modyfikator dostępu dla implementacji interfejsu jawnego, zostanie wyświetlony błąd kompilatora CS0106. Aby uzyskać więcej informacji, zobacz interface (odwołanie w C#).

Można zdefiniować implementację dla elementów członkowskich zadeklarowanych w interfejsie. Jeśli klasa dziedziczy implementację metody z interfejsu, ta metoda jest dostępna tylko za pośrednictwem odwołania typu interfejsu. Dziedziczony element członkowski nie jest wyświetlany jako część interfejsu publicznego. Poniższy przykład definiuje domyślną implementację metody interfejsu:

public interface IControl
{
    void Paint() => Console.WriteLine("Default Paint method");
}
public class SampleClass : IControl
{
    // Paint() is inherited from IControl.
}

Poniższy przykład wywołuje domyślną implementację:

var sample = new SampleClass();
//sample.Paint();// "Paint" isn't accessible.
var control = sample as IControl;
control.Paint();

Każda klasa, która implementuje IControl interfejs, może zastąpić Paint domyślną metodę jako metodę publiczną lub jako jawną implementację interfejsu.

Zobacz też