クラス ヘルパとレコード ヘルパ(Delphi)
クラスとオブジェクト:インデックス への移動
このトピックでは、クラス ヘルパ宣言の構文について説明します。
目次 |
クラス ヘルパとレコード ヘルパについて
クラス ヘルパとレコード ヘルパは型の 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 が呼び出されることに注意してください。