Sistem penggajian menyimpan data dasar seperti nama dan gaji pada class Pegawai. Ketika Manajer mewarisi Pegawai, constructor Manajer tetap menerima nama dan gaji, padahal penugasan kedua data itu sudah ditangani constructor Pegawai. Menyalin ulang penugasan tersebut berarti menduplikasi logika init di dua tempat. Kata kunci base menyelesaikan masalah ini: derived class menyerahkan bagian inisialisasi kepada constructor base class dan dapat memanggil method versi base class ketika diperlukan.
base(…) untuk Constructor #
Derived class tidak mewarisi constructor; setiap class menyusun constructornya sendiri. Namun, pembuatan object selalu dimulai dari constructor base class, lalu berlanjut ke constructor derived class. Dengan menambahkan : base(...) setelah daftar parameter, derived class meneruskan argument ke constructor base class secara eksplisit. Pola ini disebut constructor chaining.
base untuk Method #
Di dalam method derived class, pemanggilan base.NamaMethod() menjalankan versi milik base class. Bentuk ini berguna ketika versi derived class ingin memperluas perilaku lama, bukan menggantinya sepenuhnya.
Contoh: Slip Gaji Manajer #
public class Pegawai
{
public string Nama;
public int GajiDasar;
public Pegawai(string nama, int gajiDasar)
{
Nama = nama;
GajiDasar = gajiDasar;
}
public void CetakSlip()
{
Console.WriteLine($"Gaji dasar {Nama}: Rp{GajiDasar}");
}
}
public class Manajer : Pegawai
{
public int Tunjangan;
public Manajer(string nama, int gajiDasar, int tunjangan) : base(nama, gajiDasar)
{
Tunjangan = tunjangan;
}
public void CetakSlipLengkap()
{
base.CetakSlip();
Console.WriteLine($"Tunjangan: Rp{Tunjangan}");
}
}
Manajer manajer = new Manajer("Rina", 8000000, 2000000);
manajer.CetakSlipLengkap();Output yang Dihasilkan:
Gaji dasar Rina: Rp8000000
Tunjangan: Rp2000000Mari kita bedah baris demi baris:
: base(nama, gajiDasar): ConstructorManajermeneruskan dua argument pertama ke constructorPegawai, sehinggaNamadanGajiDasarterisi oleh logika milik base class.Tunjangan = tunjangan;: Hanya field baru milikManajeryang diisi di badan constructor derived class; tugas constructor menjadi ringkas.base.CetakSlip();: Method ini memanggil versiPegawai, sehingga baris pertama output berasal dari base class.Console.WriteLine($"Tunjangan: Rp{Tunjangan}"): VersiManajermenambahkan baris kedua setelah slip dasar, memperlihatkan pola perluasan: jalankan versi lama, lalu tambahkan.
error CS7036: There is no argument given that corresponds to the required parameter 'nama' of 'Pegawai.Pegawai(string, int)'Pesan di atas diperoleh dari percobaan kompilasi nyata dengan nama class yang sama. Kita cukup mengingat aturannya: tanpa base(...), compiler mencari constructor tanpa parameter di base class, dan pesan CS7036 muncul bila constructor tersebut tidak ada.
Dengan base, pembagian tugas antara base class dan derived class menjadi jelas: data dasar ditangani base class, sedangkan derived class hanya mengurus tambahannya sendiri.