例如,下列範例是針對物件 A 所產生的起始設定元原型:
void A_Init(struct A_t* const me);
第一個引數是常數指標,指向已起始設定的物件。const 關鍵字定義 ANSI C 中的常數指標。將常數指標作為引數來傳遞,可讓作業變更指標所指的物件值,但不是引數 me 所包含的位址。
物件起始設定元具有下列責任,並以下列順序執行:
子物件起始設定,包括呼叫複合物件之每一個子物件的起始設定元。至於陣列,每一個子物件的起始設定皆包括 $index 關鍵字。
依預設,起始設定元沒有引數(除了 me 引數)。如果您建立具有引數的起始設定元,則可以在「物件」視窗中輸入引數的起始值。針對具有引數的起始設定元,IBM® Rational® Rhapsody® 會從「物件」視窗中所輸入的值產生起始設定碼。
利用呼叫母項起始設定元中的 initRelations(),起始設定組合。例如,下列是針對物件 D(內含子物件 E)所產生的起始設定元:
void D_Init(D* const me) {
initRelations(me);
}
在 D 起始設定元中的 initRelations() 呼叫,會呼叫 E 的起始設定元:
static void initRelations(D* const me) {
E_Init(&me->E);
}
如果將子物件實作為陣列(例如,因為子物件的數值對應關係大於 1),則會在 initRelations() 作業中使用 while() 迴圈來起始設定子物件。例如,如果 E 的對應關係是 2,則 E 會實作為 D 中的二元素陣列。下列範例是在 D 的 initRelations() 作業中產生 while() 迴圈,以起始設定 E 的兩個實例:
static void initRelations(D* const me) {
E_Init(&(me->E));
{
RhpInteger iter = 0;
while (iter < 5){
E_Init(&((me->itsE)[iter]));
iter++;
}
}
}
如果相關的物件不是複合物件的元件,您可以讓主程式實例化其中一個物件,方法是將該物件選取作為起始實例(在配置的「起始設定」標籤中)。 在物件的起始設定元中,您可以明確建立相關的物件,然後設定其鏈結。例如,如果物件 A 及物件 B 是相關的,main() 函數將 A 實例化作為起始實例,則在 A 的起始設定元主體中,您可以撰寫下列程式碼將其鏈結設定連至 B:
B *itsB = B_Create();
A_setItsB(me, itsB);
將鏈結設為連至對多關係,會呼叫儲存器的起始設定元。在下列程式碼中,對 RiCCollection_Init() 的呼叫會將 Furnace 的鏈結設為連至三個 itsRooms。將值 RiCTRUE 傳遞至 RiCCollection_setFixedSize(),表示集合是固定大小。
void Furnace_Init(Furnace* const me, RiCTask * p_task) {
RiCReactive_init(&me->ric_reactive, (void*)me,
p_task, &Furnace_reactiveVtbl);
RiCCollection_Init(&me->itsRoom, 3);
NOTIFY_REACTIVE_CONSTRUCTOR(me, NULL, Furnace,
Furnace, Furnace(), 0, Furnace_SERIALIZE);
{
RiCCollection_setFixedSize(&me->itsRoom,
RiCTRUE);
}
initStatechart(me);
NOTIFY_END_CONSTRUCTOR(me);
}
NOTIFY_CONSTRUCTOR() 及 NOTIFY_END_CONSTRUCTOR() 呼叫是啟用動畫時所產生的檢測巨集。第一個巨集會通知動畫程式(在呼叫起始設定元之後)以及建立動畫實例。當起始設定元即將結束時,第二個巨集會通知動畫程式。
建構子的使用者程式碼包括物件屬性的起始設定。您可以在物件建構子中指定每一個參數的實際值。實際值是逐字插入作為未解譯文字。
在程式碼中的 /*#[ 與 /*#] 符號之間產生使用者程式碼。例如,您可以針對起始設定元在實作欄位中輸入下列程式碼:
RiCString temp;
RiCString_Init(&temp, "Hello World");
A_print(me, temp);
此程式碼實作如下:
void A_Init(struct A_t* const me) {
NOTIFY_CONSTRUCTOR(me, NULL, A, A, A(), 0,
A_SERIALIZE);
me->itsB = NULL;
{
/*#[ operation A() */
RiCString temp;
RiCString_Init(&temp, "Hello World");
A_print(me, temp);
/*#]*/
}
NOTIFY_END_CONSTRUCTOR(me);
}