public enum class TransactionType : unsigned char {
Deposit, Withdrawal, Transfer
};
差異於原生 enum:
TransactionType::Deposit 必須加類型前綴,避免名稱汙染。unsigned char),預設 int。public 存取修飾詞,跨組件可見。
using namespace System;
using namespace System::Threading;
public ref class Transaction abstract {
TransactionType type;
DateTime when;
protected:
Transaction(TransactionType t) {
Thread::Sleep((gcnew Random)->Next(1000,2001)); // 模擬處理延遲
type = t;
when = DateTime::Now;
}
public:
property TransactionType Type {
TransactionType get() { return type; }
private: void set(TransactionType v) { type = v; } // 衍生類可設
}
property DateTime When {
DateTime get() { return when; }
private: void set(DateTime v) { when = v; }
}
virtual void Post() abstract; // 純虛擬,衍生類必須實作
};
public ref class Deposit : Transaction {
decimal amount;
public:
Deposit(decimal amt) : Transaction(TransactionType::Deposit), amount(amt) {}
property decimal Amount { decimal get() { return amount; } }
virtual void Post() override { /* 入帳邏輯 */ }
};
public ref class Withdrawal : Transaction {
decimal amount;
public:
Withdrawal(decimal amt) : Transaction(TransactionType::Withdrawal), amount(amt) {}
property decimal Amount { decimal get() { return amount; } }
virtual void Post() override { /* 出帳邏輯 */ }
};
public ref class Transfer : Transaction {
decimal amount;
String^ fromAcct;
String^ toAcct;
public:
Transfer(String^ from, String^ to, decimal amt)
: Transaction(TransactionType::Transfer), fromAcct(from), toAcct(to), amount(amt) {}
property String^ From { String^ get() { return fromAcct; } }
property String^ To { String^ get() { return toAcct; } }
property decimal Amount { decimal get() { return amount; } }
virtual void Post() override { /* 轉帳邏輯 */ }
};
List^ txns = gcnew List();
txns->Add(gcnew Deposit(1000));
txns->Add(gcnew Withdrawal(200));
txns->Add(gcnew Transfer("A123", "B456", 500));
for each (Transaction^ t in txns) {
Console::WriteLine("{0} {1:C} at {2}", t->Type,
(dynamic_cast(t) ? (dynamic_cast(t))->Amount :
dynamic_cast(t) ? (dynamic_cast(t))->Amount :
(dynamic_cast(t))->Amount),
t->When);
t->Post();
}
abstract 關鍵字標記抽象類別,無需純虛擬函數也可防止實例化。get 公開、set 私有/受保護,實現「外部唯讀、內部可寫」。protected,強制透過衍生類建構子初始化基類狀態。dynamic_cast 或型別測試進行多型處理。