Schnittstellen

Eine Schnittstelle definiert einen Vertrag, der von Klassen und Strukturen implementiert werden kann. Eine Schnittstelle kann Methoden, Eigenschaften, Ereignisse und Indexer enthalten. Eine Schnittstelle stellt keine Implementierungen der von ihr definierten Member bereit. Sie gibt lediglich die Member an, die von Klassen oder Strukturen bereitgestellt werden müssen, die die Schnittstelle implementieren.

Schnittstellen können Mehrfachvererbung einsetzen. Im folgenden Beispiel erbt die Schnittstelle IComboBox sowohl von ITextBox als auch IListBox.

interface IControl
{
    void Paint();
}
interface ITextBox: IControl
{
    void SetText(string text);
}
interface IListBox: IControl
{
    void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}

Klassen und Strukturen können mehrere Schnittstellen implementieren. Im folgenden Beispiel implementiert die Klasse EditBox sowohl IControl als auch IDataBound.

interface IDataBound
{
    void Bind(Binder b);
}
public class EditBox: IControl, IDataBound
{
    public void Paint() { }
    public void Bind(Binder b) { }
} 

Wenn eine Klasse oder Struktur eine bestimmte Schnittstelle implementiert, können Instanzen dieser Klasse oder Struktur implizit in diesen Schnittstellentyp konvertiert werden. Beispiel:

EditBox editBox = new EditBox();
IControl control = editBox;
IDataBound dataBound = editBox;

In Fällen, in denen nicht bekannt ist, dass eine Instanz eine bestimmte Schnittstelle implementiert, können dynamische Typumwandlungen verwendet werden. Beispielsweise verwenden die folgenden Anweisungen dynamische Typumwandlungen zum Abrufen der IControl- und IDataBound-Schnittstellenimplementierungen eines Objekts. Da der eigentliche Laufzeittyp des Objekts EditBox ist, sind die Umwandlungen erfolgreich.

object obj = new EditBox();
IControl control = (IControl)obj;
IDataBound dataBound = (IDataBound)obj;

In der vorherigen EditBox-Klasse werden die Paint-Methode aus der IControl-Schnittstelle und die Bind-Methode aus der IDataBound-Schnittstelle mithilfe öffentlicher Member implementiert. C# unterstützt außerdem explizite Implementierungen eines Schnittstellenmembers, sodass die Klasse oder Struktur vermeiden können, die Member öffentlich zu machen. Eine explizite Implementierung eines Schnittstellenmembers wird mit dem vollqualifizierten Namen des Schnittstellenmembers geschrieben. Die EditBox-Klasse könnte z.B. die IControl.Paint- und IDataBound.Bind-Methode wie folgt über explizite Implementierungen eines Schnittstellenmembers implementieren.

public class EditBox: IControl, IDataBound
{
    void IControl.Paint() { }
    void IDataBound.Bind(Binder b) { }
}

Der Zugriff auf explizite Schnittstellenmember kann nur über den Schnittstellentyp erfolgen. Die von der vorherigen EditBox-Klasse bereitgestellte Implementierung von IControl.Paint kann z.B. nur aufgerufen werden, indem zuerst der EditBox-Verweis in den IControl-Schnittstellentyp konvertiert wird.

EditBox editBox = new EditBox();
editBox.Paint();            // Error, no such method
IControl control = editBox;
control.Paint();            // Ok