Borland C++Builder 擴充 C++,引入 Delphi 風格的 __property 關鍵字,讓類別屬性支援讀寫存取器、索引存取、預設值等特性,大幅提升程式碼可讀性與元件封裝能力。本文詳細說明簡單型別與陣列型別屬性的定義語法與實戰範例。
class TSome {
protected:
int a, b, s;
int GetSum() { return s = a + b; }
void SetSum(int val) { s = val; }
public:
// ... 其他程式碼 ...
__property int Sum = { read = GetSum, write = SetSum };
// 僅讀屬性:__property int Sum = { read = GetSum };
// 僅寫屬性:__property int Sum = { write = SetSum };
};
read 指定讀取存取器 (成員函數或資料成員)write 指定寫入存取器obj.Sum = 10; int v = obj.Sum;class TSome {
private:
TList* list;
protected:
void* GetItem(int i) {
return (i >= 0 && i < list->Count) ? list->Items[i] : NULL;
}
void SetItem(int i, void* ptr) { list->Insert(i, ptr); }
int GetCount() { return list->Count; }
public:
TSome() { list = new TList(); }
~TSome() { delete list; }
// 索引屬性
__property void* Items[int i] = { read = GetItem, write = SetItem };
// 僅讀計數屬性
__property int Count = { read = GetCount };
// 預設屬性 (可省略 Items):__property void* Items[int i] = { read = GetItem, write = SetItem, default };
};
TSome obj;
obj.Items[0] = somePointer; // 寫入
void* p = obj.Items[3]; // 讀取
int n = obj.Count; // 僅讀屬性
若宣告 default,可簡寫為 obj[3] 直接存取。
| 特性 | 語法範例 | 說明 |
|---|---|---|
| 預設值 | __property int Value = { read=GetVal, write=SetVal, default=0 }; | Object Inspector 顯示預設值,串流時略過預設值 |
| 儲存控制 | __property int Value = { read=GetVal, write=SetVal, stored=IsValStored }; | IsValStored 為 bool 函數決定是否序列化 |
| 節點名稱 | __property int Value = { read=GetVal, write=SetVal, nodefault }; | 明確表示無預設值 |
| 索引存取 | __property int Values[int i] = { read=GetVal, write=SetVal, index }; | 存取器簽名為 GetVal(int index) |
屬性雖直觀簡潔,但開發商業軟體時,切勿忽略異常處理。存取器中可能拋出的異常 (如記憶體不足、資源鎖定失敗) 必須妥善捕獲,避免屬性存取導致程式異常終止。
| 標準 C++ | __property |
|---|---|
obj.GetSum() / obj.SetSum(10) | obj.Sum / obj.Sum = 10 |
| 需記住 Get/Set 命名慣例 | 語法統一,IDE 智慧提示支援 |
| 無法在 Object Inspector 直接編輯 | 設計時可視化屬性編輯 |
| 跨編譯器可攜 | Borland/Embarcadero 編譯器專屬 |
__property 是 C++Builder 元件開發的核心特性,善用它能建立專業級、設計時可視化的元件庫。結合 stored、default、index 等進階屬性,可精細控制序列化行為與儲存效率。