クラス(またはメソッドを持つオブジェクトまたはレコード)を定義するとき、データフィールドをメソッドフィールドの前に表示する必要があるかどうかについての規則があるかどうか疑問に思っていましたか?
次の簡単な例の2つのケースの違いのように意味します。(特定の問題を明確にするために編集)
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は、recordメソッド内でrecord型のconstパラメーターを許可しませんか?
要約すると、メソッドの後にデータフィールドを配置すると、オブジェクトに「const」パラメーターとして指定されたオブジェクトを渡そうとするメソッドがある場合、コードはコンパイルされません。たとえば、次のようなものはコンパイルされません。
procedure TWhatever.SomeMethod( const : w1: TWhatever);
どうやらそれはDelphiの新しいバージョンでコンパイルされるようですが、私はDelphi7とDelphi 2006の両方でテストしましたが、どちらでもコンパイルされません。
この問題は、3つすべてを実行した場合にのみ発生します(データフィールドが最後になり、オブジェクトをメソッドのパラメーターとして渡し、このパラメーターに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.
Delphi7のバージョンは次のとおりです。DelphiPersonalバージョン7.0ビルド4.453。
D2006のバージョンは次のとおりです。MSWindows用のBorlandDelphi 。バージョン10.0.2288.42451、Update2。