2016-09-12 4 views
4

Coding in Delphi Buch hat dieses Beispiel über Interface-Einschränkung:Wie heißt diese Methode?

1 type 
2  IStoppable = interface 
3  procedure Stop; 
4  end; 
5 
6  TWidget<T: IStoppable> = class 
7  FProcess: T; 
8  procedure StopProcess; 
9  end; 
10 
11 { TWidget<T> } 
12 
13 procedure TWidget<T>.StopProcess; 
14 begin 
15  FProcess.Stop; 
16 end; 

ich in der Schlange nicht verstehen, 15, wie er die "Stop" Methode aufrufen ?? ist nicht FProcess eine generische Variable? Wie kann er also eine Methode aus einer Variablen aufrufen?

Auch wie kann er die "Stop" -Methode direkt von einer Schnittstelle aufrufen? Soll die implementierte Methode nicht aufgerufen werden?

+1

Da T als IStoppable deklariert ist, ruft er IStoppable.Stop. Das sieht gut aus (außer der seltsamen Formatierung). –

+0

vielen Dank Ich möchte dich alle umarmen :) – Wel

Antwort

9

FProcess ist vom Typ T wo T eingeschränkt ist eine Schnittstelle zu sein, die IStoppable oder ein aus IStoppable abgeleitet ist. Der Methodenaufruf, auf den Sie verweisen, ruft daher die Stop-Methode von IStoppable auf.

Stellen Sie sich stattdessen vor, dass FProcess vom Typ IStoppable erklärt wurde.

Wenn das so wäre dann denke ich, dass Sie den Code verstehen würden.

Wann immer Sie kämpfen, um generischen Code zu verstehen, ist dies eine nützliche Technik. Ersetzen Sie den generischen Typ durch einen konkreten Typ und lesen Sie den Code erneut. Es ist oft viel einfacher, konkreten Code zu verstehen, und dieses Verständnis wird Ihnen dann helfen, den generischen Code zu verallgemeinern.

Soweit wo die Methode implementiert ist, ist das hier nicht anders als für eine konkrete Schnittstelle. Eine Schnittstelle definiert die Schnittstelle, lässt aber die Implementierung unspezifiziert. Die Klasse, die die Schnittstellen implementiert, gibt dies an, aber Sie müssen nichts darüber wissen, um eine Schnittstelle zu verwenden. Das ist wirklich der Modus Operandi für Schnittstellen.

5

FProcess ist als generische Typ deklariert T, aber das erklärt wird, in der Einschränkung, wie IStoppable, mit anderen Worten: jeder T muss ein IStoppable (oder Derivat) und der Code kann sicher sein, dass sie die Methoden aufrufen von IStoppable darauf

Es ist völlig in Ordnung, eine Methode auf einer Schnittstelle aufzurufen. Das ist der Hauptgrund, warum sie existieren: Sie sind im Grunde eine Liste von Methoden, die aufgerufen werden können.

Und ja, die Methode muss irgendwo implementiert werden. Das ist nicht gezeigt.