【发布时间】:2022-01-02 22:48:36
【问题描述】:
我认为DELPHI语言提供了一个非常清晰漂亮的数据封装实现 通过属性方法和清除 getter 和 setter 函数。
我想通过 getter 和 setter 函数访问类字符串列表 strlst。 代码示例中的选项 #1 可以正常工作,但选项 #2 调用 Stringlist.Commatext 函数实际上不起作用。
这是一个 DELPHI 错误还是我在类设计方面遗漏了什么?
目标:填充类stringlist而不创建外部Tstringlist类,只需传递commatext。
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, classes;
type
TSimpleClass = class
FStrlst: TStringList;
private
procedure SetStrList(const Value: TStringList);
public
constructor Create;
property strlst: TStringList read FStrlst write SetStrList;
end;
{ TSimpleClass }
constructor TSimpleClass.Create;
begin
inherited;
FStrlst := TStringList.Create;
end;
procedure TSimpleClass.SetStrList(const Value: TStringList);
var
i: Integer;
begin
Writeln('class getter / setter function is called ');
for i := 0 to Value.Count - 1 do
begin
FStrlst.Add(Value[i]);
end;
writeln ('content of internal strlist : ' + FStrlst.CommaText )
end;
begin
var
aSimpleClass: TSimpleClass;
var
testLst: TStringList;
try
aSimpleClass := TSimpleClass.Create;
try
// option #1 is working
testLst:=TStringList.Create;
testLst.CommaText := 'a,b,c';
aSimpleClass.strlst := testLst;
// option #2 not working ... this code should also call the
// setter function
aSimpleClass.strlst.commatext := 'd,e,f';
finally
aSimpleClass.Free;
end;
writeln ('done sample code !');
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
命令行窗口示例输出
【问题讨论】:
-
选项 2 应该可以正常工作。你怎么知道它不起作用?您的代码没有在任何地方输出
FStrlst的数据。你期待SetStrList()被调用吗?它不会,在选项 2 中,这很好。附带说明一下,您的代码正在泄漏FStrlst,因为TSimpleClass缺少释放FStrlst的析构函数。此外,SetStrList()可以通过使用FStrlst.Assign()或 FStrlst.AddStrings(), instead of anAdd()` 循环来简化。 -
请。看看控制台输出。是的,我希望在选项 #2 中也调用了 setter,为什么不呢? (现在为 FStrlst 添加了输出选项)