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 private milik 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 #

csharp
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:

text
Saya Budi, gaji dasar saya Rp8000000.
Budi membawahi 6 orang tim.

Mari kita bedah baris demi baris:

  1. Constructor Pegawai(string nama, int gajiDasar): Base class menyiapkan data yang berlaku untuk semua jenis pegawai, yaitu Nama dan GajiDasar.
  2. Deklarasi class Manajer : Pegawai: Manajer mewarisi seluruh member publik Pegawai dan hanya menambahkan satu property baru, JumlahTim.
  3. public Manajer(...) : base(nama, gajiDasar): Constructor Manajer meneruskan dua data pertama ke constructor Pegawai melalui kata kunci base.
  4. manajer.Perkenalan(): Method ini tidak dideklarasikan di Manajer, tetapi tetap dapat dipanggil karena diwarisi dari Pegawai.
  5. manajer.Nama dan manajer.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:

csharp
Console.WriteLine(manajer is Pegawai);

Output yang Dihasilkan:

text
True

Hasil 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.