Delphi书中的编码有关于接口约束的这个例子:
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”方法?是不是应该调用已实现的方法?
答案 0 :(得分:9)
FProcess
属于T
类型,其中T
被约束为IStoppable
的接口或IStoppable
派生的接口。因此,您引用的方法调用调用Stop
的{{1}}方法。
想象一下,IStoppable
被声明为FProcess
类型。
IStoppable
如果是这样,那么我认为你会理解代码。
每当你发现自己在努力理解通用代码时,这是一种有用的技术。用通用类型替换泛型类型并再次读取代码。理解具体代码通常要容易得多,然后理解将帮助您推广通用代码。
就实现该方法的地方而言,这与具体接口没有什么不同。接口定义了接口,但未指定实现。实现接口的类指定了这个,但是为了使用接口,您不需要知道它。这实际上是接口的操作方式。
答案 1 :(得分:5)
FProcess
被声明为泛型类型T
,但在约束中声明为IStoppable
,换句话说:每个T
必须是{{} 1}}(或派生),代码可以确保它可以在其上调用IStoppable
的方法
在接口上调用方法是完全正确的。这是它们存在的主要原因:它们基本上是可以调用的方法列表。
是的,该方法必须在某处实现。这没有显示出来。