Angelo hat geschrieben:Ich denke, das von mir gewählte Beispiel hat einfach nicht die Komplexität,
dass man die Vorteile eines interface erkennen kann.
Der Vorteil von Interfaces gegenüber abstrakten Klassen ist ihre Unabhängigkeit.
Da wird nichts vererbt, keine Hierarchie und kein Abhängigkeitsbaum aufgebaut.
Ein Interface ist ein Vertrag/eine Garantie das ein Objekt die Methoden im Interface
bereitstellt.
Du machst zum Beispiel ein Interface IDurchzählen:
Code: Alles auswählen
Interface IDurchzählen
Start()
string Next()
static string const Ende = "ENDE"
EndInterface
Jede Klasse die das implementiert garantiert folgendes Verhalten:
- Beim aufruf von Start() wird das durchzählen initialisiert, so dass es am Anfang beginnt
- Bei jedem Aufruf von Next() wird das nächste Mitglied der Durchzählung zurückgegeben (als string).
- Wenn alles durchgezählt wurde gibt Next() IDurchzählen.Ende zurück.
Das ist der Vertrag über das Verhalten.
Nun kannst Du anfangen Funktionen zu schreiben die schon IDurchzählen
verwenden, ohne das sie weiteres über die Klassen wissen, die dieses
Interface implementieren werden.
Du hast in Deinem Klassensystem zum Beispiel eine Listbox-Klasse
mit der Methode Add um ganze Objekte anzuzeigen.
Deine Methode machst Du dann so:
Code: Alles auswählen
class Listbox : Gadget // erbt von Gadget
[...]
Methode Add(IDurchzählen obj)
Define string s
obj.Start()
While ( s=obj.Next() != IDurchzählen.Ende )
Füge s der Listbox hinzu
Wend
EndMethode
[...]
EndClass
Deine Methode Listbox.Add() nimmt nun jedes beliebige Objekt entgegen
das IDurchzählen implementiert hat und listet das in der Listbox auf.
Dabei muss Deine Klasse nichts weiter über das Objekt wissen, außer das
es sich durchzählen lässt.
Somit ist es vollkommen unabhängig von irgendeiner Vererbungshierarchie etc.
Nun kann jeder Klassen schreiben die IDurchzählen implementieren.
Diese beliebigen Klassen, egal für was sie sonst da sind, kann man Deiner
Listbox hinzufügen.
Ich mache zum Beispiel eine Klasse 'Schulklasse' und implementiere
das Interface IDurchzählen. Das heißt ich muß die Methoden Start()
und Next() zur Verfügung stellen.
Ich schreibe Schulklasse.Next() so, daß alle Namen der Schüler
in der Klasse nacheinander zurückgegeben werden.
Nun kann ich Listbox.Add(meineSchulkasse) aufrufen und in der
Listbox erscheint nacheinander: "Peter", "Monique", "Sarah", "Rolf", ... "Gunnar"
Ich habe noch eine ganz andere Klasse: Telefonbuch
Das Telefonbuch hat nichts mit der Schulklasse gemeinsam, keine Vererbung oder so.
Aber ich kann auch IDurchzählen in Telefonbuch implementieren:
Telefonbuch.Next() gibt nacheinander jeden Eintrag im Telefonbuch als string
zurück, und am Ende eben IDurchzählen.Ende.
Und schon kann ich auch Objekte vom Typ Telefonbuch der Listbox hinzufügen:
Listbox.Add(privatesTelefonbuch) zeigt in der Listbox an:
"Miriam, 0160 / 666 666"
"Elisabeth, 0160 / 123 123"
"Mutti, 089 / 576 682 5"
"Peter, 0172 / 83 83 549"
Und so kannst Du und jeder andere Programmierer auf der Welt in weitere beliebige Klassen
das Interface IDurchzählen implementieren.
Unabhängig davon kannst Du auch weitere Methoden schreiben, die ein beliebiges, unbekanntes Objekt
entgegen nehmen, sobald es das Interface IDurchzählen implementiert.
Zum Beispiel fügst Du eine Write-Methode zu Deiner File-Klasse hinzu, die
auch ein Objekt nimmt das IDurchzählen implementiert hat:
Code: Alles auswählen
Class File
[...]
Methode Write(IDurchzählen obj)
Define string s
obj.Start()
While ( s=obj.Next() != IDurchzählen.Ende )
Schreibe s in das aktuell geöffnete File
Wend
EndMethode
[...]
EndClass
Und schon kannst Du File.Write(meineSchulklasse) und auch
File.Write(privatesTelefonbuch) benutzen um es abzuspeichern.
Jede weitere Klasse, in die Du später auch das Interface IDurchzählen
implementierst, kannst Du danach mit Listbox.Add() und File.Write()
benutzen, ohne an Listbox oder File etwas ändern zu müssen.
Ist es so zu verstehen?
