Del*_*ser 3 delphi constructor object
我有一段简单的代码,在Delphi XE2中编译但在XE3中编译,我不知道为什么.我已经将有问题的代码减少到一点点,并且想知道Delphi认为它有什么问题.尝试在Delphi XE 2中编译包含此单元的项目工作正常,但在Delphi XE3(试用版)中,它给出了"[dcc32 Error] AffineTransform.pas(26):E2382无法使用实例变量调用构造函数".我所知道的唯一"古怪"的东西是使用旧式的"对象"类型,其中构造函数与真实对象(基于TObject的类实例)实际上并不完全相同.
如果我用'procedure'替换这个对象中的'constructor',那么它编译好了,但是为什么这样,这是我的代码中的一个好的改变,即它是一个不会对功能?
unit AffineTransform;
interface
type
{ Rectangular area. }
TCoordRect = object
public
Left, Top, Right, Bottom: Real;
constructor CreatePos(ALeft, ATop, ARight, ABottom: Real);
procedure Include(AX, AY: Real);
end;
implementation
constructor TCoordRect.CreatePos(ALeft, ATop, ARight, ABottom: Real);
begin
Left := ALeft;
Top := ATop;
Right := ARight;
Bottom := ABottom;
end;
procedure TCoordRect.Include(AX, AY: Real);
begin
CreatePos(AX, AY, AX, AY)
end;
end.
Run Code Online (Sandbox Code Playgroud)
对于这种传统的Turbo Pascal风格object,关键字实际上没有任何意义constructor.虽然object构造函数确实有一些特殊处理,但这里绝对没有必要.这里的内容只不过是record一些方法.
XE3编译器已更改,因此它不再允许您Self在实例方法内调用构造函数.这是双方的情况class和object.我没有看到任何关于为何进行此更改的文档.毫无疑问它会及时渗出.
您的直接解决方案是替换constructor为procedure.从长远来看,把它变成一个record而不是一个是有意义的object.
我还会议您将方法的名称更改为Initialize.一些图书馆设计师似乎选择在他们的记录上使用Create和Free方法.这导致了大量的代码编写如下:
ctx := TRttiContext.Create;
try
....
finally
ctx.Free;
end;
Run Code Online (Sandbox Code Playgroud)
事实上,所有代码都是虚假的,可以简单地删除!一个TRttiContext变量将自动初始化.
这种设计还为那些喜欢使用的Delphi程序员设置了一个巨大的Heffalump TrapFreeAndNil.通过记录FreeAndNil导致一些有趣的烟花!
我有一段简单的代码,在Delphi XE2中编译但在XE3中编译,我不知道为什么.
您正在尝试在已经实例化和初始化的实例的方法内调用构造函数.编译器不再允许这样做.更具体地说,这段代码:
procedure TCoordRect.Include(AX, AY: Real);
begin
CreatePos(AX, AY, AX, AY)
end;
Run Code Online (Sandbox Code Playgroud)
与此代码相同:
procedure TCoordRect.Include(AX, AY: Real);
begin
Self.CreatePos(AX, AY, AX, AY)
end;
Run Code Online (Sandbox Code Playgroud)
而且你不能再对Self变量调用构造函数了.为什么?IIRC,它与编译器正在向支持移动开发的转变有关.
| 归档时间: |
|
| 查看次数: |
2246 次 |
| 最近记录: |