標準操作を生成するためのメカニズムには、次が必要です。
site.prp ファイルで、各標準操作に 1 ペアのクラス・レベルのプロパティーを指定する必要があります。 この名前では、以下のフォーマットを使用する必要があります。
名前の "op1" 部分は、この標準操作を参照するために StandardOperations プロパティーで使用するストリングです。
Declaration プロパティーのコンテンツは、関連する .h ファイルに生成されます。 Definition プロパティーのコンテンツは、関連する .c または .cpp ファイルに生成されます。
通常、これらのプロパティーの値では、1 つ以上の IBM Rational Rhapsody キーワードを使用します。 例:
Subject CG
Metaclass Class
Property op1Declaration MultiLine "void $Name;"
Property op1Definition MultiLine "void $Name: $Name() {int x=7;}"
Property op2Declaration MultiLine "void $Name_serialize;"
Property op2Definition MultiLine "void $Name: $Name_serialize{}"
end
end
定義対象の標準操作のコードにクラス・メンバーの操作を組み込む可能性があるため、Rational Rhapsody は、クラスの各属性、関係、または操作で繰り返されるコードを生成するためのキーワードを提供します。
クラスのすべての属性を含むコードを定義するには、次のようにします。
クラスのすべての関連を含むコードを定義するには、次のようにします。
クラスのすべての操作を含むコードを定義するには、次のようにします。
クラスの各引数に対して繰り返されるコードを定義することもできます。 これには、イベント引数およびクラスに存在する操作のすべての引数が含まれます。
すべての引数を含むコードを定義するには、次のようにします。
テンプレート・クラスの標準操作を定義する場合は、キーワード $NameWithTemplateParams を使用できます。 ClassA という名前のクラスが存在し、それがテンプレートの場合、このキーワードは、"ClassA<params>" に置き換えられます。 そのクラスがテンプレートでない場合、キーワードは、"ClassA" に置き換えられます。 以下のプロパティー定義では、コピー・コンストラクターを定義する場合のこのキーワードの使用法を示します。
Subject CG
Metaclass Class
Property CopyCtorDeclaration MultiLine "$Name(const $NameWithTemplateParams & x);"
Property CopyCtorDefinition MultiLine "$NameWithTemplateParams::$Name(const $NameWithTemplateParams & x) { /* some code */ }"
end
あるクラスが拡張する基底クラスから情報を取得するコードを定義することもできます。
このようなコードを定義するには、次のようにします。
プロパティー CG::Class::StandardOperations は、site.prp ファイルに挿入されたプロパティー名に基づいて、操作参照のコンマ区切りのリストを取得します。
op1Declaration、op1Definition、op2Declaration、および op2Definition という名前のクラス・レベルのプロパティーを追加した場合は、クラスのプロパティー StandardOperations の値として op1、op2 を指定すると、そのクラスに 2 つの標準操作が生成されます。
この例では、標準操作フィーチャーを使用して、イベントのシリアル化を実装する方法を示します。 このアプローチは、非シリアル化の実装と同様です。
特定のパッケージのすべてのイベントで操作を生成するには、次のようにします。
CG::Event::serializeDeclaration
public: strstream & serializer(strstream & theStrStream) const;
CG::Event::serializeDefinition
strstream & $Name::serialize(strstream & theStrStream) {
$Base
$Arguments
return theStrStream;
}
CG::Argument::serialize
theStrStream << $Name;
CG::Event::serializeBase
$Name::serialize(theStrStream);