ネストした型宣言
クラスとオブジェクト:インデックス への移動
型宣言はクラス宣言内でネストできます。ネストした型は、オブジェクト指向プログラミング全般で使用されます。ネストした型は、概念的に関連する型をまとめたり、名前の競合を回避するための手段になります。Win32 Delphi コンパイラでは、ネストした型の宣言と同じ構文を使用できます。
ネストした型の宣言
nestedTypeDeclaration は、型の宣言で定義されている型宣言構文にしたがいます。
type className = class [abstract | sealed] (ancestorType) memberList type nestedTypeDeclaration memberList end;
ネストした型宣言は、最初の識別子以外のトークン(procedure、class、type、すべての可視性スコープ指定子など)の位置で終了します。
ネストした型とそれを包含している型には、通常のアクセス可能性規則が適用されます。ネストした型は、コンテナクラスのインスタンス変数(フィールド、プロパティ、メソッド)にアクセスできますが、アクセスにはオブジェクト参照が必要です。ネストした型は、オブジェクト参照なしでもクラスフィールド、クラスプロパティ、および静的クラスメソッドにアクセスできますが、通常の Delphi 可視性規則が適用されます。
ネストした型は、それを包含しているクラスのサイズを増加させません。包含しているクラスのインスタンスを作成しても、ネストした型のインスタンスは作成されません。ネストした型は、その宣言のコンテキストによってのみ、それを包含しているクラスに関連付けられます。
ネストしたクラスの宣言とアクセス
次の例は、ネストしたクラスのフィールドとメソッドを宣言およびアクセスする方法を示します。
type TOuterClass = class strict private myField: Integer; public type TInnerClass = class public myInnerField: Integer; procedure innerProc; end; procedure outerProc; end;
内部クラスの innerProc メソッドを実装するには、外部クラスの名前でメソッド名を修飾する必要があります。次に例を示します。
procedure TOuterClass.TInnerClass.innerProc; begin ... end;
ネストした型のメンバにアクセスするには、標準のクラスメンバへのアクセスと同じドット表記を使用します。次に例を示します。
var x: TOuterClass; y: TOuterClass.TInnerClass; begin x := TOuterClass.Create; x.outerProc; ... y := TOuterClass.TInnerClass.Create; y.innerProc;
ネストした定数
ネストした型セクションと同じ方法で、クラス型内に定数を宣言できます。定数セクションは、ネストした型セクションと同じトークン(予約語または可視性指定子)で終了します。型付き定数はサポートされていないため、Borland.Delphi.System.Currency や Borland.Delphi.System.TDateTime などの値型のネストした定数は宣言できません。
ネストした定数には、任意の単純型(順序型、順序部分範囲型、列挙型、文字列型、実数型)を使用できます。
次のコードに、ネストした定数を宣言する例を示します。
type TMyClass = class const x = 12; y = TMyClass.x + 23; procedure Hello; private const s = 'A string constant'; end; begin Writeln(TMyClass.y); // y の値(35)を書き込む end.