尝试了解 Delphi 接口

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

我正在阅读 Nick Hodges 的书《Coding in Delphi》来学习 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.

我的问题是:如何使用该界面?这两个函数被声明为受保护,那么我如何从表单访问它们?我是否必须将它们定义为公共,还是应该使用

INameInterface
接口单元?

我对接口非常困惑!!!

delphi interface
1个回答
9
投票

除了您已经表现出的理解之外,您还需要了解三件事。

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
的函数。只有达到这一点,接口才能发挥其潜力。

© www.soinside.com 2019 - 2024. All rights reserved.