Schnittstellen (C#-Programmierhandbuch)
Aktualisiert: November 2007
Wie im folgenden Beispiel werden Schnittstellen mit dem Schlüsselwort interface definiert:
interface IEquatable<T>
{
bool Equals(T obj);
}
Schnittstellen beschreiben eine Gruppe verwandter Funktionen, die zu einer beliebigen Klasse oder Struktur gehören können. Schnittstellen können aus Methoden, Eigenschaften, Ereignissen, Indexern oder einer beliebigen Kombination dieser vier Membertypen bestehen. Eine Schnittstelle darf keine Felder enthalten. Schnittstellenmember sind automatisch öffentlich.
Wenn eine Klasse oder Struktur eine Schnittstelle erbt, bedeutet dies, dass die Klasse bzw. die Struktur eine Implementierung für sämtliche Member bereitstellt, die von der Schnittstelle definiert werden. Die Schnittstelle selbst stellt keine Funktionen bereit, die von einer Klasse oder Struktur wie Basisklassenfunktionen geerbt werden können. Wenn eine Basisklasse jedoch eine Schnittstelle implementiert, erbt die abgeleitete Klasse die entsprechende Implementierung.
Klassen und Strukturen können von Schnittstellen auf dieselbe Art und Weise erben, wie Klassen eine Basisklasse oder -struktur erben. Es bestehen lediglich zwei Unterschiede:
Eine Klasse oder eine Struktur kann mehr als eine Schnittstelle erben.
Wenn eine Klasse oder Struktur eine Schnittstelle erbt, erbt sie nur die Methodennamen und -signaturen, da die Schnittstelle selbst keine Implementierungen enthält. Beispiel:
public class Car : IEquatable<Car> { public string Make {get; set;} public string Model { get; set; } public string Year { get; set; } // Implementation of IEquatable<T> interface public bool Equals(Car car) { if (this.Make == car.Make && this.Model == car.Model && this.Year == car.Year) { return true; } else return false; } }
Um einen Schnittstellenmember zu implementieren, muss der entsprechende Member der Klasse öffentlich und nicht statisch sein, und er muss über denselben Namen und dieselbe Signatur wie der Schnittstellenmember verfügen. Eigenschaften und Indexer für eine Klasse können zusätzliche Accessoren für eine Eigenschaft oder einen Indexer definieren, die bzw. der für eine Schnittstelle definiert ist. Eine Schnittstelle kann beispielsweise eine Eigenschaft mit einem get-Accessor deklarieren, während die Klasse, die die Schnittstelle implementiert, dieselbe Eigenschaft mit einem get-Accessor und einem set-Accessor deklarieren kann. Wenn die Eigenschaft oder der Indexer jedoch explizite Implementierung verwendet, müssen die Accessoren übereinstimmen.
Schnittstellen und Schnittstellenmember sind abstrakt. Schnittstellen stellen keine Standardimplementierung bereit. Weitere Informationen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.
Die IEquatable<T>-Schnittstelle teilt dem Benutzer des Objekts mit, dass dieses auf Gleichheit mit anderen Objekten desselben Typs untersucht werden kann, wobei dem Benutzer der Schnittstelle keine entsprechenden Implementierungsdetails bekannt sein müssen.
Schnittstellen können von anderen Schnittstellen erben. Eine Klasse kann eine Schnittstelle durch geerbte Basisklassen oder Schnittstellen mehrfach erben. In diesem Fall kann die Klasse die Schnittstelle jedoch nur einmal implementieren, wenn sie als Teil der neuen Klasse deklariert wurde. Wenn die geerbte Schnittstelle nicht als Bestandteil der neuen Klasse deklariert wurde, wird die Implementierung der Schnittstelle von der Basisklasse bereitgestellt, in der die Schnittstelle deklariert wurde. Eine Basisklasse kann Schnittstellenmember unter Verwendung virtueller Member implementieren. In diesem Fall kann die Klasse, die die Schnittstelle erbt, durch Überschreiben der virtuellen Member das Schnittstellenverhalten ändern. Weitere Informationen zu virtuellen Membern finden Sie unter Polymorphismus.
Übersicht über Schnittstellen
Eine Schnittstelle verfügt über folgende Eigenschaften:
Eine Schnittstelle ähnelt einer abstrakten Basisklasse: Jeder nicht abstrakte Typ, der die Schnittstelle erbt, muss alle ihre Member implementieren.
Eine Schnittstelle kann nicht direkt instanziiert werden.
Schnittstellen können Ereignisse, Indexer, Methoden und Eigenschaften enthalten.
Schnittstellen enthalten keine Implementierung von Methoden.
Klassen und Strukturen können von mehr als einer Schnittstelle erben.
Eine Schnittstelle selbst kann von mehreren Schnittstellen erben.
In diesem Abschnitt
Explizite Schnittstellenimplementierung (C#-Programmierhandbuch)
Erklärt, wie ein schnittstellenspezifischer Klassenmember erstellt wird.Gewusst wie: Explizites Implementieren von Schnittstellenmembern (C#-Programmierhandbuch)
Bietet ein Beispiel, wie Member der Schnittstellen explizit implementiert werden.Gewusst wie: Explizites Implementieren von Schnittstellenmembern mit Vererbung (C#-Programmierhandbuch)
Bietet ein Beispiel, wie Member der Schnittstellen durch Vererbung explizit implementiert werden.
Verwandte Abschnitte
Schnittstelleneigenschaften (C#-Programmierhandbuch)
Erklärt, wie Eigenschaften für eine Schnittstelle deklariert werden.Indexer in Schnittstellen (C#-Programmierhandbuch)
Erklärt, wie Indexer für eine Schnittstelle deklariert werden.Gewusst wie: Implementieren von Schnittstellenereignissen (C#-Programmierhandbuch)
Illustriert, wie eine Schnittstelle ein Ereignis deklarieren kann.Klassen und Strukturen (C#-Programmierhandbuch)
Beschreibt, wie in C# Objekte, Klassen und Strukturen verwendet werden.Vererbung (C#-Programmierhandbuch)
Erklärt, wie in C# Vererbung implementiert wird.Methoden (C#-Programmierhandbuch)
Erklärt das Konzept von benannten Methoden im C#-Programmiermodell.Polymorphismus (C#-Programmierhandbuch)
Beschreibt, wie Klassen als mehr als ein Typ in C# verwendet werden können.Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch)
Beschreibt, wie das abstract-Schlüsselwort und das sealed-Schlüsselwort die Vererbung beeinflussen.Eigenschaften (C#-Programmierhandbuch)
Erklärt das Konzept von Eigenschaften in C#.Ereignisse (C#-Programmierhandbuch)
Erklärt das Konzept von Ereignissen in C#.Indexer (C#-Programmierhandbuch)
Erklärt das Konzept von Indexern in C#.