2016-09-12 94 views
4

編碼德爾福書中有關於接口約束這個例子:如何調用此方法?

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; 

我不在線15明白他怎麼叫「停」的方法?是不是FProcess是一個通用變量?那麼他怎麼能從一個變量中調用一個方法呢?

他怎麼能直接從界面調用「Stop」方法?是不是應該調用實現的方法?

+1

由於T被聲明爲IStoppable,他正在調用IStoppable.Stop。這看起來很好(除了奇怪的格式)。 –

+0

非常感謝我想擁抱你所有:) – Wel

回答

9

FProcess是其中T被限制爲是IStoppable或一個從IStoppable衍生的接口T類型。因此您所稱的方法調用IStoppableStop方法。

想象一下,FProcess被宣佈爲IStoppable類型。

FProcess: IStoppable; 

如果是這樣,那麼我認爲你會理解代碼。

每當你發現自己在努力理解泛型代碼時,這是一種有用的技巧。將泛型替換爲具體類型並再次讀取代碼。理解具體代碼通常會容易得多,而理解將幫助您推廣到通用代碼。

就實現該方法而言,這裏與具體接口沒有什麼不同。接口定義了接口,但未指定實現。實現這些接口的類指定了這個接口,但您不需要知道該接口就可以使用該接口。這實際上是接口的工作方式。

5

FProcess被聲明爲泛型類型T,但聲明,在約束,如IStoppable,換句話說:每T必須是IStoppable(或衍生物)和代碼可以肯定的是它可以調用的方法的IStoppable

在接口上調用方法是完全正確的。這是它們存在的主要原因:它們基本上是可以調用的方法列表。

是的,該方法必須在某處執行。沒有顯示。

相關問題