我正在阅读 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
接口单元?
我对接口非常困惑!!!
除了您已经表现出的理解之外,您还需要了解三件事。
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
的函数。只有达到这一点,接口才能发挥其潜力。