我正在玩接口。
unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
IOrcs = interface
['{89B86797-9F86-48B8-8D0B-01A78C2CA523}']
function Enemies : string;
end;
IHumans = interface
['{D32C39A3-C654-4078-BD5A-0D3793530FB0}']
function Allies : string;
end;
TOrc = class (TInterfacedObject, IOrcs)
function Enemies : string;
end;
THuman = class (TInterfacedObject, IHumans)
function Allies : string;
end;
TElves = class (TInterfacedObject, IHumans,IOrcs)
private
fOrc : IOrcs;
public
constructor Create;
function Enemies : string;
function Allies : string;
property Orc : IOrcs read fOrc implements IOrcs;
end;
TForm1 = class(TForm)
btnHumans: TButton;
btnOrcs: TButton;
ListBox1: TListBox;
btnElves: TButton;
procedure btnHumansClick(Sender: TObject);
procedure btnOrcsClick(Sender: TObject);
procedure btnElvesClick(Sender: TObject);
private
{ Private declarations }
procedure Log ( str : string );
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TOrc }
function TOrc.Enemies: string;
begin
Result := 'Our Enemies Humans';
end;
{ THumans }
function THuman.Allies: string;
begin
Result := 'Our Allies Elves';
end;
{ TForm1 }
procedure TForm1.btnElvesClick(Sender: TObject);
var Allied : IHumans;
Horde : IOrcs;
Test : TElves;
begin
Allied := TElves.Create;
Log('IHumans');
Log(Allied.Allies);
Log('IOrcs');
Horde := Allied as IOrcs;
Log(Horde.Enemies);
Log('TElves.Create');
Test := TElves.Create;
Log(test.Allies);
Log(test.Enemies);
end;
procedure TForm1.btnHumansClick(Sender: TObject);
var Allied : IHumans;
begin
Allied := THuman.Create;
Log(Allied.Allies);
end;
procedure TForm1.btnOrcsClick(Sender: TObject);
var Horde : IOrcs;
begin
Horde := TOrc.Create;
Log(Horde.Enemies);
end;
procedure TForm1.Log(str: string);
begin
ListBox1.Items.Add(str);
end;
{ TElves }
function TElves.Allies: string;
begin
Result:='Wood Elves';
end;
constructor TElves.Create;
begin
fOrc := TOrc.Create;
end;
function TElves.Enemies: string;
begin
Result:='Orcs and Dwarwes';
end;
end.
这里的问题是关于 TElves 的。
我有一个 Enemies 函数,并且有一个实现 IOrcs 的 Orc 属性,所以我猜这就是从 IOrcs 而不是本地调用 Enemies 函数的原因。
如果我注释掉该属性,则会调用本地敌人函数。
我显然不明白这个的用例,也许我这样做完全错误。但是当使用 IInterface 而不是 TClass 时,有没有办法调用本地函数?
问候 罗伯特
该方法是从 TOrcs 调用的,因为:
中的
implements IOrcs
property Orc : IOrcs read fOrc implements IOrcs;
implements 指令允许您将接口的实现委托给实现类中的属性。
这意味着在你的类中实现
IOrcs
将使用fOrc
TElves = class (TInterfacedObject, IHumans,IOrcs)
private
fOrc : IOrcs;
public
constructor Create;
function Enemies : string;
function Allies : string;
property Orc : IOrcs read fOrc;
end;