如何为Delphi的函数类型变量创建正确的Getter访问器?
问题根源
你遇到的编译错误,核心原因是调用无参数Getter函数时未加括号:Delphi会将无括号的函数名解析为成员方法指针(而非执行函数获取返回值),导致类型不匹配。
解决方法
方法1:调用Getter时添加括号
直接修改Button1Click中的代码,给Getter函数调用加上括号,明确执行函数并获取返回值:
procedure TForm5.Button1Click(Sender: TObject); var aMF1 : TMyFactory1; aMF2 : TMyFactory2; begin aMF1 := getMyFactory1(); // 添加括号执行函数,返回TMyFactory1类型值 aMF2 := getMyFactory2(); // 添加括号执行函数,返回TMyFactory2类型值 end;
方法2:使用Delphi属性替代自定义Getter(更符合语言习惯)
Delphi的属性机制天然支持方法类型的读取,无需手动编写get前缀函数,代码更简洁易读:
步骤1:修改类的声明
在TForm5的public段替换原Getter函数为属性:
type TForm5 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private fMyFactory1 : TMyFactory1; fMyFactory2 : TMyFactory2; public // 直接绑定私有字段的属性(无需额外逻辑时推荐) property MyFactory1: TMyFactory1 read fMyFactory1; property MyFactory2: TMyFactory2 read fMyFactory2; // 如果需要在读取时添加额外逻辑,仍可指定自定义Getter函数 // property MyFactory1: TMyFactory1 read getMyFactory1; // property MyFactory2: TMyFactory2 read getMyFactory2; end;
步骤2:修改调用代码
在Button1Click中直接通过属性名读取值:
procedure TForm5.Button1Click(Sender: TObject); var aMF1 : TMyFactory1; aMF2 : TMyFactory2; begin aMF1 := MyFactory1; aMF2 := MyFactory2; end;
内容的提问来源于stack exchange,提问作者SOLID Developper
相关产品推荐
相关产品推荐

