Thema: Delphi Interfaces

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Interfaces

  Alt 1. Nov 2005, 22:31
Hm, kommt der Sache schon nahe. Ein grobe Skizzierung stimmt. Also du möchtest genau genommen nicht nur eine Klasse skizzieren, sondern du möchtest garantieren, dass eine Klasse bestimmte Eigenschaften (oder eher Funktionen) hat.
Ich merk gerade, dass ich einige Dinge vergessen habe. Also machen wir mal weiter, ein Interface ist nur abstrakt. Es gibt keine Implementierung im Interface. Du sagst jede Liste hat eine Funktion die "füge hinzu" heißt. Aber die ist (für das Interface) virtuell und muss von jeder (nicht abstrakten) Klasse implementiert werden. Das heißt, Einkaufsliste muss eine Funktion "füge hinzu" bekommen.

Dann ist noch ein ganz wichtiger (von mir vergessener Teil), du kannst eine Klasse auch auf ihre Vorfahren und Interfaces reduzieren. Ok, ist gerade schlecht ausgedrückt, aber sagen wir deine Einkaufsliste ist eine Klasse, die das Interface Liste implementiert und gleichzeitig auch die Funktion "doFoo" besitzt. Dann sichert dir das Interface die zwei Funktionen "füge hinzu" und "lese nächsten Eintrag" zu. doFoo ist hingegen nur für Einkaufsliste vorhanden.
Der Unterschied wäre nun folgender :

Delphi-Quellcode:
var
  e1 : TEinkaufsListe;
  e2 : TListe;
begin
  e1 := TEinkaufsListe.Create;

// nicht möglich, da TListe ein Interface ist, keine Klasse
// e2 := TList.Create;

// Möglich, aber achtung, e2 wird nur als TListe behandelt!
  e2 := TEinkaufsListe.Create;

  e1.doFoo; // klappt, da e1 TEinkaufsliste
  e1.leseNaechstenEintrag; // muss es geben, da TEinkaufliste TListe implementiert

  e2.leseNaechstenEintrag; // möglich, da jedes TListe-Objekt diese Methode hat
  e2.doFoo; // nicht möglich, da e2 TListe, nur "fuegeHinzu" und "leseNaechstenEintrag" verfuegbar
end;
Wie du hier (schlecht erklärt) siehst, kann man Variablen auch vom Typ des Interface haben. Die Idee hier ist, dass die Funktionen im Interface das einzigste sind was dich interessiert. Ein vielleicht schönes Beispiel wäre TStrings. Hierbei handelt es sich auch nur um ein Interface (behaupte ich einfach mal). Dieses stellt Funktionen zum Einfügen und Suchen von Strings in einer Liste bereit.
TStringList und THashedStringList sind zwei komplett verschiedene Implementierungen. Wenn ich nun eine Funktion mit Parameter List : TStrings habe, kann ich an dieser Stelle sowohl eine TStringList, als auch eine THashedStringlist übergeben. Dass die eine intern irgendwas mit Hashcodes macht, interessiert mich nicht, wenn ich nur alle Einträge in eine Datei schreiben möchte. Mag vielleicht schneller gehen oder was weiß ich, aber kann mir egal sein. Ich will nur wissen, wie ich alle Einträge lesen kann. Für TStrings wäre ein Weg :

Delphi-Quellcode:
procedure writeToFile(list : TStrings);
var i : Integer;
begin
  for i := 0 to list.Count - 1 do
    begin
      write(list.Strings[i]);
    end;
end; // procedure writeToFile(list : TStrings);
Den Code kann ich nehmen, und für list ein TStringList, eine THashedStringlist oder was auch immer TStrings implementiert übergeben. Es wird immer funktionieren. Ok, jetzt kann ich es zugegeben, TStrings ist glaube ich eine abstrakte Klasse. Aber Interfaces sind fast das selbe. Wichtig für ein Interface ist halt nur, dass nichts implementiert ist. Das heißt jede Methode ist virtuell/abstract und muss implementiert werden.
  Mit Zitat antworten Zitat