Delphi OOP 接口,委托方法,为什么以及何时调用哪一个

问题描述 投票:0回答:1

我正在玩接口。

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 时,有没有办法调用本地函数?

问候 罗伯特

oop delphi interface
1个回答
0
投票

该方法是从 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;
© www.soinside.com 2019 - 2024. All rights reserved.