生成标准操作

可能在实现某些目的时要使用标准操作,例如复制构造函数、序列化或覆盖基类的虚拟操作。Rational® Rhapsody® 提供了在已生成代码中包含标准操作的机制。

生成标准操作的机制涉及:

指定 site.prp 文件中标准操作的代码

声明和定义属性

在 site.prp 文件中,必须为每个标准操作提供一对类级属性。名称必须使用以下格式:

  • CG::Class::op1Declaration
  • CG::Class::op1Definition

名称的“op1”部分是将要在 StandardOperations 属性中使用的字符串,用以参考此标准操作。

将在相应的 .h 文件中生成“声明”属性的内容。将在相应的 .c 或 .cpp 文件中生成“声明”属性的内容。

通常将在这些属性的值中使用一个或多个 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
注: 添加至 site.prp 文件的属性对用于 C 和 C++。如果使用的是 Java,只需添加操作(例如 javaOp1Definition)的“定义”属性,然后包含该属性值中的所有必需 Java 代码。

定义类成员代码

由于您可能要对正在定义的标准操作代码中包含类成员的处理,因此 Rational Rhapsody 提供了关键字,用于生成将重复类中每个属性、关系或操作的代码。

要定义涉及类中所有属性的代码,请:

  • 在 site.prp 文件中,创建名为 CG::Attribute::(标准操作的引用名称)的属性,例如,CG::Attribute::op1。使用此属性可指定要应用于类中所有属性的代码。在代码中,可将 $Name 等标准关键字用于属性名称。
  • 在为标准操作创建的“定义”属性值中,插入要在其中生成此属性相关代码的关键字 $Attributes。

要定义涉及类中所有关联的代码,请:

  • 在 site.prp 文件中,创建名为 CG::Relation::(标准操作的引用名称)的属性,例如,CG::Relation::op1。使用此属性可指定要应用于类中所有关联的代码。在代码中,可将 $Name 等标准关键字用于关联名称。
  • 在为标准操作创建的“定义”属性值中,插入要在其中生成此关系相关代码的关键字 $Relations。

要定义涉及类中所有操作的代码,请:

  • 在 site.prp 文件中,创建名为 CG::Operation::(标准操作的引用名称)的属性,例如,CG::Operation::op1。使用此属性可指定要应用于类中所有操作的代码。在代码中,可将 $Name 等标准关键字用于操作名称。
  • 在为标准操作创建的“定义”属性值中,插入要在其中生成此操作相关代码的关键字 $Operations。

定义参数代码

还可定义用于重复类中每个参数的代码。其中包括了所有事件参数和类中包含的所有操作参数。

要定义涉及所有参数的代码,请:

  • 在 site.prp 文件中,创建名为 CG::Argument::(标准操作的引用名称)的属性,例如,CG::Argument::op1。使用此属性可指定要应用于所有参数的代码。在代码中,可将 $Name 等标准关键字用于参数名称。
  • 在为标准操作创建的“定义”属性值中,插入要在其中生成此参数相关代码的关键字 $Arguments。

定义模板类代码

定义模板类标准操作时,可使用关键字 $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

定义基类代码

还可定义从某类扩展的基类中获取信息的代码。

要定义这种代码,请:

  • 在 site.prp 文件中,创建名为 CG::Class::(标准操作的引用名称)Base 的属性,例如,op1Base。使用此属性可指定应基于基类的代码。如果在此代码中使用如 $Attributes 的关键字,那么将为基类中的每个属性生成用属性 CG::Attribute::op1 指定的代码。
  • 在为标准操作创建的“定义”属性值中,插入要在其中生成此基类相关代码的关键字 $Base。

指定要为类生成哪些标准操作

属性 CG::Class::StandardOperations 使用以逗号分隔的操作参考列表,取决于 site.prp 文件中包含的属性名。

如果添加了名为 op1Declaration、op1Definition、op2Declaration 和 op2Definition 的类级属性,那么若把 op1 和 op2 指定为该类的 StandardOperations 属性值,则将为类生成两项标准操作。

注: 也可将 CG::Class::StandardOperations 属性值设置为高于独立类级别。例如,如果将属性值设置为包级别,那么将为包中的所有类生成标准操作。

示例 - 使用序列化标准操作

此示例显示如何使用标准操作功能执行事件序列化。方法与执行非序列化类似。

要为给定包中的所有事件生成操作,请:

生成的代码

如果使用 severitypriority 这两个参数定义了名为 VoiceAlarm 的事件,且 VoiceAlarm 继承自 Alarm,那么生成的代码如下:

strstream & VoiceAlarm::serialize(strstream & theStrStream) {
   Alarm::serialize(theStrStream);
   theStrStream << severity;
   theStrStream << priority;
   return theStrStream;
}

反馈