我正在阅读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接口单元? 我对界面非常困惑!!!
性爱
答案 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
的函数。当你达到这一点时,接口可以发挥其潜力。