Semua field pada bab-bab sebelumnya ditandai public, sehingga kode mana pun boleh menulis rekening.Saldo = -1000000; tanpa melewati method apa pun. Kebebasan tersebut berisiko ketika class menyimpan data yang memiliki aturan, misalnya saldo yang tidak boleh berkurang di luar mekanisme tarik. Access modifier mengatur hal ini: kata kunci pada setiap deklarasi anggota yang menentukan siapa yang boleh mengaksesnya.
Daftar Access Modifier #
| Modifier | Cakupan akses |
|---|---|
public | Semua kode, termasuk kode di luar class dan di luar project |
private | Hanya kode di dalam class yang sama |
internal | Hanya kode di dalam assembly (project) yang sama |
protected | Class pemiliknya beserta class turunannya |
protected internal | Gabungan protected dan internal: turunan maupun kode dalam assembly yang sama |
private protected | Gabungan yang lebih ketat: hanya turunan yang berada dalam assembly yang sama |
Dua modifier terakhir adalah kombinasi lanjutan; keduanya cukup dikenali agar tidak asing saat membaca kode orang lain.
private Menjaga Field Saldo #
public class RekeningBank
{
private int saldo;
public string Pemilik;
public RekeningBank(string pemilik, int saldoAwal)
{
Pemilik = pemilik;
saldo = saldoAwal;
}
public void Setor(int jumlah)
{
saldo += jumlah;
}
public int BacaSaldo()
{
return saldo;
}
public void TampilkanInfo()
{
Console.WriteLine($"Rekening a.n. {Pemilik} - Saldo: Rp{saldo}");
}
}
RekeningBank rekening = new RekeningBank("Budi", 500000);
rekening.Setor(200000);
Console.WriteLine($"Saldo dibaca lewat method: Rp{rekening.BacaSaldo()}");
rekening.TampilkanInfo();Output yang Dihasilkan:
Saldo dibaca lewat method: Rp700000
Rekening a.n. Budi - Saldo: Rp700000Mari kita telaah baris demi baris:
private int saldo;: field ditandaiprivate, sehingga hanya kode di dalam classRekeningBankyang dapat membaca atau menulisnya.- Constructor dan
Setor: keduanya berada di dalam class, sehingga bebas mengaksessaldo; aturan pengisian dan penambahan saldo kini melekat pada class. BacaSaldo(): pintu baca yangpublic; method mengembalikan nilaisaldotanpa memberi hak tulis kepada luar.- Pemanggilan dari luar:
rekening.Setor(...)danrekening.BacaSaldo()sah karena keduanyapublic; akses langsung sepertirekening.saldotidak lagi mungkin.
Ketika Compiler Menolak Akses #
Percobaan mengakses anggota private dari luar class ditolak compiler sebelum program berjalan. Project uji berikut memuat dua baris pelanggaran:
RekeningBank rekening = new RekeningBank("Budi", 500000);
rekening.saldo = 100000;
Console.WriteLine(rekening.saldo);Pesan compiler yang dihasilkan:
error CS0122: 'RekeningBank.saldo' is inaccessible due to its protection levelGalat CS0122 dilaporkan untuk setiap baris yang melanggar; hasilnya berasal dari eksekusi dotnet build nyata dengan path project dipangkas agar ringkas.
internal dan protected #
internal membatasi akses ke kode dalam assembly yang sama, yaitu hasil kompilasi satu project (.exe atau .dll). Demonstrasi internal membutuhkan dua project yang berdiri sendiri, sehingga bab ini hanya menjelaskan mekanismenya: ketika anggota internal pada project A dirujuk dari project B, compiler melaporkan bahwa anggota tersebut tidak dapat diakses. Pola ini dipakai untuk class yang tidak dimaksudkan menjadi pustaka pihak lain.
protected bekerja berpasangan dengan inheritance: selain class pemiliknya, class turunan juga boleh mengakses anggota protected, sedangkan kode lain tetap ditolak. Penjelasan lengkapnya menunggu bab inheritance pada bagian ini, karena contohnya membutuhkan class turunan.