在Delphi中实现接口时,如果实现方法不在公共部分中,这是否重要?

时间:2016-05-04 13:58:15

标签: delphi interface

鉴于以下界面:

ITest = interface ['guidhere']
  procedure TestMethod;
end;

是否有任何理由在实现类中将TestMethod()声明为public?我已将它放在privateprotected部分中,但它似乎没有任何区别。我只是想知道是否有任何指导方针,从设计角度(或任何真正的角度来看),使public部分正确部分实现该方法。

2 个答案:

答案 0 :(得分:4)

  

如果实施方法不在公共部分,这有关系吗?

就编译器而言。没什么区别。

话虽如此。私有方法仍然是私有的,即使您可以通过界面访问它们。

unit unit1;
....
IItest = interface
  ['{A3D5FEB6-8E29-4EA8-8DC9-7988294EFA65}']
  procedure Test;
end;

TTest = class(TInterfacedObject, IItest)
private
  procedure Test;
end;

unit unit2;
....
var
  TestT: TTest;
  TestI: ITest;
begin
  TestT:= TTest.Create;
  TestI:= TTest.Create;
  TestT.Test;  //will not compile.
  TestI.Test;  //works.

这样做的原因是界面只有一个指向其VMT中方法的指针列表。该方法的定义在接口定义中给出 编译器仅检查签名是否匹配 它不会检查方法的可见性。

根据艾伦的评论,这是一个深思熟虑的设计:

  

使方法成为私有或受保护将确保您只能通过接口访问它们。这是一种为对象的预期用途强制执行使用合同的方法。

请注意,这不是错误,甚至是坏事 属性可以提供'访问'私人方法:

property Items[index: integer] read GetItem write SetItem;  

这里GetItem和SetItem通常是私有的 这会强制您使用该属性访问Items 使用属性时,实现方法通常受到保护(或更糟:--)。相同的逻辑适用于属性和接口。

接口更多,因为如果你混合接口访问和常规访问,你将遇到引用计数问题。

清洁代码
请注意,您可以根据需要在类标题中包含尽可能多的可见性部分 这样,您可以将所有接口方法放在一个部分中,将所有非接口方法放在另一个部分中。

TTest = class(TInterfacedObject, I1, I2)
//I1 methods
private
  ... private I1 methods here...
protected
  .. more I1 methods
//I2 methods
private
  .. some I2 methods
protected
  ..more I2 methods     
//TTest methods
private
  //data members
public
  constructor Create;
  destructor Destroy; override;
end;

这样就可以清楚地了解它是什么。

答案 1 :(得分:0)

我很欣赏这是一个老问题,但是答案不再准确。

我正在使用Rio和from the documentation

  

接口的所有成员都是公共的。不允许使用可见性说明符和存储说明符。 (但是可以将数组属性声明为默认属性。)

这确实是我观察到的。禁用接口将不允许指定受保护的,私有的或公共的。