属性と RTTI
属性(RTTI) への移動
属性の概念、属性の一般的な使用例、Delphi 言語における属性の基本的な制限事項の一部について紹介します。
メモ: Delphi 属性は C++Builder でサポートされていません。C++Builder での RTTI についての詳細は、「Delphi RTTI と C++Builder」を参照してください。
はじめに
属性は、追加情報を備えた特殊なオブジェクトによる型および型メンバの注釈付けを可能にする Delphi の言語機能です。このような情報は実行時に問い合わせ可能です。属性は、通常のオブジェクト指向モデルにアスペクト指向要素を付け加えるものです。
一般に、属性が役に立つのは、オブジェクトやレコードなどの構造化型の実行時分析と、注釈属性で提供される追加情報に基づく新しい動作の導入を行う汎用フレームワークを構築する場合です。
属性と RTTI
属性そのものは、型やメンバの動作を変更しません。コンシューマ(ユーザー)コードでは、属性が存在するかどうかを具体的に問い合わせ、必要な場合には適切に対処する必要があります。コンパイル済みバイナリ内のエンティティに属性を付加できるようにするには、まず、そのエンティティについて出力される RTTI 情報が必要です。つまり、RTTI 情報が明示的に無効になっている型は、属性による注釈の対象にはなりません。たとえば、以下のコードでは、TDerivedObject クラスの RTTI 情報が明示的に無効になっているため、SomeCustomAttribute はコンパイル済みバイナリには出力されません。
type
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
TDerivedObject = class(TObject)
[SomeCustomAttribute()]
procedure Shoot;
end;