鉴于以下界面:
ITest = interface ['guidhere']
procedure TestMethod;
end;
是否有任何理由在实现类中将TestMethod()
声明为public
?我已将它放在private
和protected
部分中,但它似乎没有任何区别。我只是想知道是否有任何指导方针,从设计角度(或任何真正的角度来看),使public
部分正确部分实现该方法。
答案 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:
接口的所有成员都是公共的。不允许使用可见性说明符和存储说明符。 (但是可以将数组属性声明为默认属性。)
这确实是我观察到的。禁用接口将不允许指定受保护的,私有的或公共的。