ネストした型宣言

提供: Appmethod Topics
移動先: 案内検索

クラスとオブジェクト:インデックス への移動

型宣言はクラス宣言内でネストできます。ネストした型は、オブジェクト指向プログラミング全般で使用されます。ネストした型は、概念的に関連する型をまとめたり、名前の競合を回避するための手段になります。Win32 Object Pascal コンパイラでは、ネストした型の宣言と同じ構文を使用できます。

ネストした型の宣言

nestedTypeDeclaration は、型の宣言で定義されている型宣言構文にしたがいます。


type
  className = class [abstract | sealed] (ancestorType)
      memberList

      type
         nestedTypeDeclaration

      memberList
  end;

ネストした型宣言は、最初の識別子以外のトークン(procedureclasstype、すべての可視性スコープ指定子など)の位置で終了します。

ネストした型とそれを包含している型には、通常のアクセス可能性規則が適用されます。ネストした型は、コンテナクラスのインスタンス変数(フィールド、プロパティ、メソッド)にアクセスできますが、アクセスにはオブジェクト参照が必要です。ネストした型は、オブジェクト参照なしでもクラスフィールド、クラスプロパティ、および静的クラスメソッドにアクセスできますが、通常の Object Pascal 可視性規則が適用されます。

ネストした型は、それを包含しているクラスのサイズを増加させません。包含しているクラスのインスタンスを作成しても、ネストした型のインスタンスは作成されません。ネストした型は、その宣言のコンテキストによってのみ、それを包含しているクラスに関連付けられます。

ネストしたクラスの宣言とアクセス

次の例は、ネストしたクラスのフィールドとメソッドを宣言およびアクセスする方法を示します。


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.Object Pascal.System.CurrencyBorland.Object Pascal.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.

関連項目