Aplikasi penggajian mengenal banyak peran: Pegawai biasa, Manajer, hingga Direktur. Semuanya memiliki nama dan gaji dasar, tetapi tiap peran punya data tambahan sendiri. Menyalin field Nama dan GajiDasar ke setiap class membuat kode berulang dan rawan tidak sinkron. Inheritance memecahkan masalah ini dengan membiarkan satu class mewarisi member dari class lain.
Base Class dan Derived Class #
C# menuliskan pewarisan dengan tanda titik dua. Deklarasi class Manajer : Pegawai menjadikan Pegawai sebagai base class dan Manajer sebagai derived class. Derived class otomatis membawa seluruh member publik milik base class, sehingga kita cukup menambahkan member yang benar-benar baru.
Dua batasan perlu diingat:
- Member
privatemilik base class tidak dapat diakses langsung dari derived class, meskipun member tersebut tetap tersimpan di dalam object. - Constructor tidak diwarisi; derived class memanggil constructor base class melalui kata kunci
base.
Contoh: Pegawai dan Manajer #
public class Pegawai
{
public string Nama { get; set; }
public int GajiDasar { get; set; }
public Pegawai(string nama, int gajiDasar)
{
Nama = nama;
GajiDasar = gajiDasar;
}
public void Perkenalan()
{
Console.WriteLine($"Saya {Nama}, gaji dasar saya Rp{GajiDasar}.");
}
}
public class Manajer : Pegawai
{
public int JumlahTim { get; set; }
public Manajer(string nama, int gajiDasar, int jumlahTim) : base(nama, gajiDasar)
{
JumlahTim = jumlahTim;
}
}
Manajer manajer = new Manajer("Budi", 8000000, 6);
manajer.Perkenalan();
Console.WriteLine($"{manajer.Nama} membawahi {manajer.JumlahTim} orang tim.");Output yang Dihasilkan:
Saya Budi, gaji dasar saya Rp8000000.
Budi membawahi 6 orang tim.Mari kita bedah baris demi baris:
- Constructor
Pegawai(string nama, int gajiDasar): Base class menyiapkan data yang berlaku untuk semua jenis pegawai, yaituNamadanGajiDasar. - Deklarasi
class Manajer : Pegawai:Manajermewarisi seluruh member publikPegawaidan hanya menambahkan satu property baru,JumlahTim. public Manajer(...) : base(nama, gajiDasar): ConstructorManajermeneruskan dua data pertama ke constructorPegawaimelalui kata kuncibase.manajer.Perkenalan(): Method ini tidak dideklarasikan diManajer, tetapi tetap dapat dipanggil karena diwarisi dariPegawai.manajer.Namadanmanajer.JumlahTim: Baris terakhir memadukan data warisan dan data tambahan dalam satu output.
Menguji Hubungan is-a #
Operator is memeriksa apakah sebuah object berasal dari class tertentu, termasuk melalui rantai pewarisan:
Console.WriteLine(manajer is Pegawai);Output yang Dihasilkan:
TrueHasil True menegaskan bahwa object Manajer dianggap sebagai Pegawai. Hubungan ini berlaku berlapis: bila nanti ada class Direktur : Manajer, object Direktur sekaligus dianggap Manajer dan Pegawai.
Inheritance menghilangkan duplikasi, tetapi member warisan berperilaku sama untuk semua turunan. Bab berikutnya membahas cara turunan mengganti perilaku method warisan melalui method overriding, sehingga setiap peran dapat menampilkan datanya dengan caranya sendiri.