假设您有一个设计精良的Delphi项目,该项目尊重依赖注入和其他一些良好实践.
现在让我们假设你需要模拟一个定义为的类:
TMyClass = class
public
procedure Method1;
procedure Method2
end;
Run Code Online (Sandbox Code Playgroud)
Method1而且Method2不是虚拟的.在这种情况下你做什么?要模拟一个对象,我们需要继承它和override你想要模拟的每个方法,但在这种情况下它是不可能的,因为它们不是virtual.我应该更改源代码以添加virtual我需要模拟的每个方法吗?不是很糟糕吗?
编辑
我正在考虑创建一个编译器指令来使类中的所有字段virtual成为一个好的意识形态?只有我的测试套件才会设置编译器指令.
EDIT2*
Embarcadero应该提供一种简单的方法,可以将类的方法指针更改为另一个方法点,而无需使用virtual.
考虑这个简单的代码
{$APPTYPE CONSOLE}
uses
Rtti,
SysUtils;
type
{$M+}
TFoo = class
strict private
class var Field1 : Integer;
field2 : Integer;
private
field3 : Integer;
class var Field4 : Integer;
end;
Var
ctx : TRttiContext;
f : TRttiField;
begin
try
ctx:=TRttiContext.Create;
for f in ctx.GetType(TFoo).GetFields do
Writeln(f.Name);
Writeln('Done');
readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
运行此时,仅field3列出该列表.似乎哪个RTTI不支持字段,strict private或者class var,问题是Is possible access a strict private field of a delphi class …