首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++/CLI 繼承與列舉實戰:銀行交易類別體系與 CLI enum class

     編輯:VC 教學

CLI enum class 特性


public enum class TransactionType : unsigned char {
    Deposit, Withdrawal, Transfer
};

差異於原生 enum:

  • 強型別:TransactionType::Deposit 必須加類型前綴,避免名稱汙染。
  • 可指定底層型別(unsigned char),預設 int。
  • 支援 public 存取修飾詞,跨組件可見。
  • 符合 CLS,語言互通無障礙。

抽象基類 Transaction


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,強制透過衍生類建構子初始化基類狀態。
  • 列舉作為判別聯集(Discriminated Union)替代品,搭配 dynamic_cast 或型別測試進行多型處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved