Kapsülleme (Encapsulation)

Gün 2: Nesne Yönelimli Programlama (OOP) | Erişim belirleyicileri: local, protected, public

Kaynak Kod

// =============================================================================
// GUN 2 - Konu 4: Kapsulleme (Encapsulation): local, protected, public
// =============================================================================

class BankAccount;
  // public: Disaridan erisilebilir (varsayilan)
  string owner;

  // local: Sadece bu sinif icinden erisilebilir
  local real balance;
  local int  account_no;
  local static int next_account = 1000;

  // protected: Bu sinif ve alt siniflardan erisilebilir
  protected string account_type;
  protected int    transaction_count;

  function new(string owner, real initial_balance = 0, string acc_type = "Standard");
    this.owner       = owner;
    this.balance     = initial_balance;
    this.account_type = acc_type;
    this.account_no  = next_account++;
    this.transaction_count = 0;
  endfunction

  // Public getter (okuma erisimi saglar)
  function real get_balance();
    return balance;
  endfunction

  function int get_account_no();
    return account_no;
  endfunction

  function int get_transaction_count();
    return transaction_count;
  endfunction

  // Public setter (kontrollu yazma)
  function bit deposit(real amount);
    if (amount <= 0) begin
      $display("  [HATA] Gecersiz miktar: %.2f", amount);
      return 0;
    end
    balance += amount;
    transaction_count++;
    $display("  [+] %.2f yatirildi. Yeni bakiye: %.2f", amount, balance);
    return 1;
  endfunction

  function bit withdraw(real amount);
    if (amount <= 0 || amount > balance) begin
      $display("  [HATA] Gecersiz cekim: %.2f (Bakiye: %.2f)", amount, balance);
      return 0;
    end
    balance -= amount;
    transaction_count++;
    $display("  [-] %.2f cekildi. Yeni bakiye: %.2f", amount, balance);
    return 1;
  endfunction

  function void display();
    $display("  Hesap #%0d | Sahip: %s | Tip: %s | Bakiye: %.2f | Islem: %0d",
             account_no, owner, account_type, balance, transaction_count);
  endfunction
endclass

// Alt sinif: protected'a erisebilir, local'a erisemez
class PremiumAccount extends BankAccount;
  local real credit_limit;

  function new(string owner, real initial_balance, real credit_limit = 5000);
    super.new(owner, initial_balance, "Premium");
    this.credit_limit = credit_limit;
  endfunction

  // protected uyelere erisim (OK)
  function void show_details();
    $display("  [Premium] Tip: %s, Islem sayisi: %0d, Kredi limiti: %.2f",
             account_type, transaction_count, credit_limit);
  endfunction
endclass

module kapsulleme;
  initial begin
    BankAccount    acc1;
    PremiumAccount acc2;

    $display("=== Kapsulleme (Encapsulation) ===\n");

    // --- Public erisim ---
    $display("--- Hesap Olusturma ---");
    acc1 = new("Ali", 1000.0);
    acc2 = new("Ayse", 5000.0, 10000.0);
    acc1.display();
    acc2.display();

    // --- Kontrollu erisim (getter/setter) ---
    $display("\n--- Islemler (Kontrollu Erisim) ---");
    void'(acc1.deposit(500));
    void'(acc1.withdraw(200));
    void'(acc1.withdraw(99999));   // Hata: yetersiz bakiye
    void'(acc1.deposit(-100));     // Hata: negatif miktar
    
    $display("\n  Bakiye (getter ile): %.2f", acc1.get_balance());
    $display("  Islem sayisi: %0d", acc1.get_transaction_count());

    // --- local erisim denemesi (derleme hatasi verir) ---
    // acc1.balance = 999999;       // HATA: 'balance' local
    // acc1.account_no = 0;         // HATA: 'account_no' local

    // --- protected erisim (alt siniftan) ---
    $display("\n--- Protected Erisim (Alt Sinif) ---");
    void'(acc2.deposit(2000));
    acc2.show_details();

    // --- Sonuc ---
    $display("\n--- Sonuc ---");
    acc1.display();
    acc2.display();

    $display("\n=== Kapsulleme Sonu ===");
    $finish;
  end
endmodule