RTTI 指令(Delphi)
Delphi コンパイラ指令のリスト:インデックス への移動
種類 |
式 |
構文 |
{$RTTI INHERIT|EXPLICIT [visibility-clause]} |
スコープ |
ローカル |
構文
$RTTI 指令の一般的な構文は 3 つの部分に分けることができます。$RTTI の基本形式は以下のとおりです。
{$RTTI INHERIT|EXPLICIT [visibility-clause]}
visibility-clause:
METHODS|PROPERTIES|FIELDS (visibility-expression)
visibility-expression:
[vcPrivate],[vcProtected], [vcPublic], [vcPublished];
説明
$RTTI 指令は、クラス型またはレコード型について出力される拡張 RTTI 情報(実行時型情報)の量を制御するのに使用されます。特定のクラス メンバまたはレコード メンバの拡張 RTTI を開発者側で選択的に有効または無効にできるようにするというのが、その基本的な考え方です。
INHERIT RTTI モードでは、指定の RTTI オプションをクラスが基底クラスから継承できます。例:
{$RTTI INHERIT}
TDerivative = class(TBase)
...
end;
この例では、TDerivative の RTTI オプションはすべて必ず基底クラス TBase から継承されます。特定の情報のみ継承するには、たとえば、次のような、より複雑な指令を記述できます。
{$RTTI INHERIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}
TDerivative = class(TBase)
...
end;
この例では、public および published 可視性のメソッドとプロパティの RTTI オプションのみ継承します。なお、INHERIT はレコード型には使用できません。レコードの派生はできず、レコードには上位クラスがないためです。
継承した RTTI オプションを明示的にオーバーライドする場合は、EXPLICIT モードを使用します。いったん EXPLICIT を使用すると、継承したオプションはすべて無効になり、新しいオプションが設定されます。以下はその例です。
{$RTTI EXPLICIT METHODS([vcPublished]) PROPERTIES([vcPublished])}
TDerivative = class(TBase)
...
end;
上記の例では、継承した RTTI オプションをすべて無効にし、新しいオプションを定義しています。そこでは、published 可視性のメソッドとプロパティのみ拡張 RTTI があります。
指定されたクラスまたはレコードの拡張 RTTI 情報をすべて無効にするには、たとえば以下のような RTTI 指令を記述できます。
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
この例では、継承した RTTI オプションをすべて無効にし、拡張 RTTI 情報をまったく出力しないように新しいオプションを設定しています。