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