当我们在 Delphi 中设计一个类时,通常我们有私有字段(成员)、私有 setter 和 getter 方法以及一个公共属性。从课堂之外,只能通过公共财产访问该数据;该类的用户甚至不知道存在 getter 方法。
所以 getter 和 setter 方法封装了实例成员,而属性封装了 getter 和 setter 方法。
但是,在定义接口时,我们会公开这些方法:
ICounter = interface
// I wouldn't want to specify these 2 methods in the interface, but I'm forced to
function GetCount: Integer;
procedure SetCount(Value: Integer);
property Count: Integer read GetCount write SetCount;
end;
实现具体类:
TCounter = class(TInterfacedObject, ICounter)
private
function GetCount: Integer;
procedure SetCount(Value: Integer);
public
property Count: Integer read GetCount write SetCount;
end
使用它:
var
Counter: ICounter;
begin
Counter := TCounter.Create;
Counter.Count := 0; // Ok, that's my public property
// The access should me made by the property, not by these methods
Counter.SetCount(Counter.GetCount + 1);
end;
如果属性封装了getter/setter私有方法,这不是违规吗?getter 和 setter 是具体类的内部结构,不应暴露。