11.2 高级接口技术
为了进一步深入探讨接口的功能,在我们研究现实世界接口的使用场景之前,有必要介绍一些接口的高级技术特性,例如类如何实现多个接口,或如何用不同名称的方法实现接口方法(以防名称冲突)。
另一个重要的功能是接口可以有属性。为了演示所有这些与接口相关的高级功能,我编写了 IntfDemo 示例。
11.2.1 接口的属性
本节的代码基于两个不同的接口 IWalker 和 IJumper,这两个接口都定义了一些方法和一个属性。
接口属性只是一个映射到一个读取和写入方法的名字。与类不同的是,你不能将接口属性映射到字段,因为接口本身不能有任何代码。
这里是实际的接口定义:
IWalker = interface
['{0876F200-AAD3-11D2-8551-CCA30C584521}']
function Walk: string;
function Run: string;
procedure SetPos(Value: Integer);
function GetPos: Integer;
property Position: Integer read GetPos write SetPos;
end;
IJumper = interface
['{0876F201-AAD3-11D2-8551-CCA30C584521}']
function Walk: string;
function Jump: string;
procedure SetPos(Value: Integer);
function GetPos: Integer;
property Position: Integer read GetPos write SetPos;
end;
当你实现一个带属性的接口时,你只需实现属性实际的访问方法:
TRunner = class(TInterfacedObject, IWalker)
private
FPos: Integer;
public
function Walk: string;
function Run: string;
procedure SetPos(Value: Integer);
function GetPos: Integer;
end;
实现代码并不复杂(您可以在 IntfDemo 示例中找到),其中的Run方法包括计算新位置和显示正在执行的操作:
function TRunner.Run: string;
begin
Inc(FPos, 2); //计算新位置
Result := FPos.ToString + ': Run';
end;
使用 IWalker 接口及其 TRunner 实现的演示代码如下:
var
Intf: IWalker;
begin
Intf := TRunner.Create;
Intf.Position := 0;
Show(Intf.Walk);
Show(Intf.Run);
Show(Intf.Run);
end;
输出结果应该 不会意外:
1: Walk
3: Run
5: Run