クラス ヘルパとレコード ヘルパ(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 が呼び出されることに注意してください。