Hallo!
Interfaces geben Dir die Möglichkeit, von einem Objekt bestimme Methoden und Eigenschaften zu "fordern", ohne es auf einen bestimmten Typ festzulegen. Das macht Interfaces extrem flexibel.
Nehmen wir eine generische List, die sortierbar sein soll:
Chrome-Quelltext
1: 2: 3: 4: 5: 6:
| type MyList<T> = public class where T is IComparable; public method Sort; end; |
Ich habe hier nur gefordert, dass T das Interface IComparable implementiert, damit jedes Element die CompareTo-Methode besitzt und ich sortieren kann. Es ist hier also egal, von welcher Klasse die Elemente sind, solange sie nur IComparable implementiert. Damit ist eine solche Klasse viel flexibler und an viel mehr Stellen einsetzbar, als wenn ich eine bestimmte Mutterklasse vorschreiben würde.
Interfaces sind aber auch ein weiteres Mittel der Kapselung. Ich kann z.B. so etwas machen:
Chrome-Quelltext
1: 2: 3: 4: 5: 6:
| type MyList<T> = public class where T is IComparable; public method GetSortedValues : IEnumerable<T>; end; |
Hier sage ich nur, dass GetSortedValues eine Sequenz von Werten zurückgibt. Ich sage nichts, wie diese Sequenz implentiert ist. Das kann ein Array sein oder eine Liste. Ich "verrate" also noch weniger über die interne Implementation, was die Kapselung vergrößert.
Ein Vorteil von Interfaces ist auch, dass eine Klasse beliebig viele Interfaces implementieren kann. Das kann man sehr schön bei Plugins verwenden. Man kann verschiedene Interfaces zur Verfügung stellen, welche eine Plugin-Klasse implementieren kann, aber nicht muss. Und je nachdem, welche Interfaces eine Plugin-Klasse implementiert hat, wird sie an verschiedenen Stellen im Host-Programm "angsprochen".
Ich könnte noch Stunden lang über Interfaces schreiben, aber kurz gesagt: Sie sind unglaublich flexibel und insbesondere in Verbindung mit Generics Gold Wert.
Grüße
Christian
P.S.: Interfaces gibt's übrigens nicht nur in .NET
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".