当您定义一个类(或带有方法的对象或记录)时,我只是想知道数据字段是否应该出现在方法字段之前是否有任何约定?
我的意思是像下面这个简单的例子中两种情况之间的区别。(编辑以使具体问题更清楚)
type TWhatever = Object
private
a,b : Integer;
public
procedure SetWhatever(x,y :Integer);
procedure ShowWhatever;
end;
相对
type TWhatever = Object
public
procedure SetWhatever(x,y :Integer);
procedure ShowWhatever
private
a,b : Integer;
end;
我一直使用首先列出数据字段的约定,但老实说,我并不认为它有任何区别。但是最近我遇到了一些不起作用的代码(无法编译),除非首先列出数据字段。
我在这里记录了这个案例:Delphi 2006 wont allow const parameters of type record within record method?
总结是,如果您将数据字段放在方法之后,那么如果对象有任何方法尝试将给定对象作为“const”参数传递,则代码将无法编译。例如像这样的东西不会编译:
procedure TWhatever.SomeMethod( const : w1: TWhatever);
显然它将在更高版本的 Delphi 上编译,但我已经在 Delphi7 和 Delphi 2006 上对其进行了测试,但两者都无法编译。
仅当您执行所有三件事时才会出现问题(数据字段最后,在方法中将对象作为参数传递,为此参数使用 const 关键字)。因此,您可以通过从参数中删除 const 关键字或将数据字段放在方法之前来解决问题。
无论如何,这个问题让我想知道这里是否有要遵循的约定?
编辑我添加了这个来给出一个特定的代码示例
以下程序无法在 D7 和 D2006 上编译:
program bugtest;
{$APPTYPE CONSOLE}
uses SysUtils;
type Tob = object
public
procedure setOb(const a,b: integer);
procedure addToOb(const ob1: Tob);
procedure printOb;
private
x,y : Integer;
end;
procedure Tob.setOb(const a,b: integer);
begin
x:=a; y:=b;
end;
procedure Tob.addToOb(const ob1: Tob);
begin
x:=x+ob1.x; y:= y+ob1.y;
end;
procedure Tob.printOb;
begin
writeln(x,' ',y);
end;
var r1,r2: Tob;
begin
r1.setOb(2,3);
r2.setOb(10,100);
r1.addToOb(r2);
r1.printOb;
r2.printOb;
readln;
end.
以下程序可以在 D7 和 D2006 上完美编译和运行:
program bugtest;
{$APPTYPE CONSOLE}
uses SysUtils;
type Tob = object
private
x,y : Integer;
public
procedure setOb(const a,b: integer);
procedure addToOb(const ob1: Tob);
procedure printOb;
end;
procedure Tob.setOb(const a,b: integer);
begin
x:=a; y:=b;
end;
procedure Tob.addToOb(const ob1: Tob);
begin
x:=x+ob1.x; y:= y+ob1.y;
end;
procedure Tob.printOb;
begin
writeln(x,' ',y);
end;
var r1,r2: Tob;
begin
r1.setOb(2,3);
r2.setOb(10,100);
r1.addToOb(r2);
r1.printOb;
r2.printOb;
readln;
end.
Delphi 7 版本为:Delphi Personal Version 7.0 build 4.453。
D2006版本是:Borland Delphi for MS Windows。版本 10.0.2288.42451,更新 2。