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

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

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


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

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

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

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

ヘルパの構文

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

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

ancestor list はオプションです。

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

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

複数のヘルパを宣言して、ある 1 つの型に関連付けることができます。ただし、ソース コードの任意の場所で適用されるヘルパの数は、0 または 1 つだけです。最も近いスコープで定義されたヘルパが適用されます。クラス ヘルパやレコード ヘルパのスコープは、Object Pascal の通常の方法で決定されます(たとえば、ユニットの 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 が呼び出されることに注意してください。

関連項目