尝试了解Delphi接口

时间:2015-01-30 13:33:42

标签: delphi interface

我正在阅读Nick Hodges'书" Delphi编码"我试图了解界面使用情况。 在一个单元中,我设置了简单的界面:

unit INameInterface;

interface

type
  IName = interface
  ['{CE5E1B61-6F44-472B-AE9E-54FF1CAE0D70}']
    function FirstName: string;
    function LastName: string;
  end;

implementation

end.

在另一个单元中,根据书中样本我已经实现了这个界面:

unit INameImplementation;

interface

uses
  INameInterface;

type
  TPerson = class(TInterfacedObject, IName)
    protected
      function FirstName: string;
      function LastName: string;
  end;

implementation

{ TPerson }

function TPerson.FirstName: string;
begin
  Result := 'Fred';
end;

function TPerson.LastName: string;
begin
  Result := 'Flinstone';
end;

end.

此时我已经创建了一个简单的VCL表单应用程序,以便使用我创建的对象。表单代码如下:

unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, INameImplementation;

type
  TfrmMain = class(TForm)
    lblFirtName: TLabel;
    lblLastName: TLabel;
    txtFirstName: TStaticText;
    txtLastName: TStaticText;
    btnGetName: TButton;
    procedure btnGetNameClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Person: TPerson;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  txtFirstName.Caption := '';
  txtLastName.Caption := '';
end;

procedure TfrmMain.btnGetNameClick(Sender: TObject);
begin
  txtFirstName.Caption := ...
end;

end.

我的问题是:我该如何使用界面?这两个函数被声明为protected,所以如何从表单中访问它们?我将它们定义为公共,还是应该使用INameInterface接口单元? 我对界面非常困惑!!!

性爱

1 个答案:

答案 0 :(得分:8)

除了你已经证明的理解之外,基本上你有三件事要知道。

<强> 1。如何调用接口的方法

如果您有对接口的引用,那么您可以像在类引用上一样调用方法:

var
  Name: IName;
....
Writeln(Name.FirstName);
Writeln(Name.LastName);

<强> 2。如何获取界面参考

通常,您可以通过实例化实现您希望使用的接口的类来执行此操作:

var
  Name: IName;
....
Name := TPerson.Create;
// now you can use Name as before

还有其他方法可以获取接口引用,但现在让我们将它们留在一边。

第3。如何传递接口

每次需要使用界面时,您可能不希望创建新对象。因此,您可以让其他方通过您使用的界面。例如,接口可以作为方法参数传递:

procedure Foo(Name: IName);
begin
  // use Name as before
end;

您可以通过函数调用和属性等获取接口引用。


  

这两个函数被声明为protected,那么如何从表单中访问它们?

好吧,它们在实现对象中声明为protected。但是你不会通过实现对象访问它们。您将通过界面访问它们。这意味着从接口的角度来看,实现对象中的可见性是不相关的。

您的表单单元引用创建实现该接口的对象所需的INameImplementation。您还需要使用INameInterface,以便您的代码可以看到界面本身。

此示例还不是很强大,因为您仍然可以看到实现对象的类型。但想象一下,如果这对你隐藏了,你所能看到的只是一个返回IName的函数。当你达到这一点时,接口可以发挥其潜力。