クラス ヘルパとレコード ヘルパ(Delphi)

提供: RAD Studio
移動先: 案内検索

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


このトピックでは、クラス ヘルパ宣言の構文について説明します。

クラス ヘルパとレコード ヘルパについて

クラス ヘルパとレコード ヘルパは型の 1 つです。他のクラスやレコードと関連付けると、関連付けられた型(またはその下位クラス)のコンテキストで使用されるメソッドに別の名前を追加したり、プロパティを追加します。 ヘルパは、継承を使用せずにクラスを拡張する方法であり、継承がまったく許可されないレコードにとっても便利なものです。 ヘルパは、識別子を解決するときに、コンパイラが使用するスコープの範囲を広げる機能です。 クラス ヘルパやレコード ヘルパを宣言する場合は、ヘルパの名前と、そのヘルパで拡張する型の名前を記述します。 規格上、拡張クラスや拡張レコードを使用できるすべての箇所で、ヘルパを使用できます。 このため、コンパイラの解決スコープは、元の型にヘルパを加えたものになります。

クラス ヘルパやレコード ヘルパは型を拡張する方法ですが、新規コード開発時に使用する設計ツールとして見なすべきではありません。 新規のコードでは常に、通常のクラス継承およびインターフェイス実装を用いるべきです。

ヘルパの構文

クラス ヘルパを宣言する構文は、次のとおりです。

type
   identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
     memberList
   end;

ancestor list はオプションです。 これは、クラス ヘルプに対してのみ指定することができ、現在の宣言によって拡張された既存のクラス ヘルパを示します。

ヘルパ型はインスタンス データを宣言しないことがありますが、クラス フィールドは許可されます。

可視性のスコープ規則と memberList の構文については、通常のクラス型およびレコード型と同じです。

メモ: クラス ヘルパとレコード ヘルパは、演算子のオーバーロードをサポートしません。

複数のヘルパを宣言して、ある 1 つの型に関連付けることができます。 ただし、ソース コードの任意の場所で適用されるヘルパの数は、0 または 1 つだけです。 最も近いスコープで定義されたヘルパが適用されます。 クラス ヘルパやレコード ヘルパのスコープは、Delphi の通常の方法で決定されます(たとえば、ユニットの uses 句では右から左)。

ヘルパを使用する

次のコードに、クラス ヘルパの宣言例を示します(レコード ヘルパも同様に動作します)。

 
 type
    TMyClass = class
       procedure MyProc;
       function  MyFunc: Integer;
    end;
 
    ...
 
    procedure TMyClass.MyProc;
    var X: Integer;
    begin
       X := MyFunc;
    end;
 
    function TMyClass.MyFunc: Integer;
    begin
        ...
    end;
 
 ...
 
 type
    TMyClassHelper = class helper for TMyClass
      procedure HelloWorld;
      function MyFunc: Integer;
    end;
 
    ...
 
    procedure TMyClassHelper.HelloWorld;
    begin
       Writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper
    end;
 
    function TMyClassHelper.MyFunc: Integer;
    begin
      ...
    end;
 
 ...
 
 var
   X: TMyClass;
 begin
   X := TMyClass.Create;
   X.MyProc;    // Calls TMyClass.MyProc
   X.HelloWorld; // Calls TMyClassHelper.HelloWorld
   X.MyFunc;    // Calls TMyClassHelper.MyFunc
ヒント: クラス ヘルパは実際のクラス型より優先されるので、クラス ヘルパ関数 MyFunc が呼び出されることに注意してください。

クラス ヘルパおよびレコード ヘルパは、組み込み型または列挙型を拡張する必要がある際には機能しません。 例:

type
    TMyEnum = (one, two, three);
    TMyEnumHelper = record helper for TMyEnum
      function GetNext: TMyEnum;
    end;

関連項目