gpt4 book ai didi

delphi - 尝试了解 Delphi 接口(interface)

转载 作者:行者123 更新时间:2023-12-03 14:52:39 25 4
gpt4 key购买 nike

我正在阅读 Nick Hodges 的书“Coding in Delphi”,我正在尝试了解界面的用法。在一个单元中,我放置了一个简单的界面:

unit INameInterface;

interface

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

implementation

end.

在另一个单元中,我根据本书示例放置了该接口(interface)的实现:

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 ,那么我如何从表单访问它们?我必须将它们定义为公共(public)的,还是应该使用 INameInterface 接口(interface)单元?我对接口(interface)非常困惑!!!

爱神

最佳答案

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

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

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

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

<强>2。如何获取接口(interface)引用

通常,您可以通过实例化一个实现您希望使用的接口(interface)的类来实现此目的:

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

还有其他方法可以获取接口(interface)引用,但我们暂时将这些方法放在一边。

<强>3。如何传递接口(interface)

您可能不希望每次需要使用接口(interface)时都创建一个新对象。这样你就可以让其他方将接口(interface)传递给你使用。例如,接口(interface)可以作为方法参数传递:

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

可以通过函数调用、属性等方式获取接口(interface)引用

<小时/>

The two functions are declared as protected so how can I access them from the form?

嗯,它们在实现对象中被声明为“ protected ”。但您不会通过实现对象来访问它们。您将通过界面访问它们。这意味着从接口(interface)的角度来看,实现对象中的可见性并不相关。

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

这个示例还不是很强大,因为您仍然可以看到实现对象的类型。但想象一下,如果它对您隐藏,并且您只能看到一个返回 IName 的函数。只有达到这一点,接口(interface)才能发挥其潜力。

关于delphi - 尝试了解 Delphi 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com