代码之家  ›  专栏  ›  技术社区  ›  user1937012

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

  •  0
  • user1937012  · 技术社区  · 2 年前

    我在玩界面。

    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,所以我想这就是为什么Enemies函数是从IOrcs而不是本地调用的。

    如果我注释掉属性,就会调用Local Enemies函数。

    我显然不理解这个用例,也许我这样做完全错了。但是,当使用IInterface而不是TClass时,有没有方法可以调用本地函数?

    当做 罗伯特

    1 回复  |  直到 2 年前
        1
  •  0
  •   Bosshoss    2 年前

    该方法是从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;