Method warisan dari bab inheritance berperilaku sama untuk semua turunan. Padahal setiap hewan punya suara berbeda, dan memaksa semua turunan memakai pesan generik Hewan mengeluarkan suara. membuat program kurang bermakna. Method overriding mengizinkan derived class mengganti isi method warisan dengan implementasinya sendiri, tanpa menyentuh base class.

virtual di Base, override di Derived #

Overriding menuntut dua deklarasi yang berpasangan. Base class menandai method dengan kata kunci virtual untuk menyatakan bahwa method tersebut boleh diganti. Derived class kemudian menandai versi penggantinya dengan override. Kedua method wajib memiliki nama, parameter, dan return type yang sama.

Contoh: Hewan Bersuara #

csharp
public class Hewan
{
    public virtual void Bersuara()
    {
        Console.WriteLine("Hewan mengeluarkan suara.");
    }
}

public class Kucing : Hewan
{
    public override void Bersuara()
    {
        Console.WriteLine("Kucing: Meong!");
    }
}

public class Sapi : Hewan
{
    public override void Bersuara()
    {
        Console.WriteLine("Sapi: Moo!");
    }
}

Hewan hewanUmum = new Hewan();
Kucing kucing = new Kucing();
Sapi sapi = new Sapi();

hewanUmum.Bersuara();
kucing.Bersuara();
sapi.Bersuara();

Output yang Dihasilkan:

text
Hewan mengeluarkan suara.
Kucing: Meong!
Sapi: Moo!

Mari kita bedah baris demi baris:

  1. public virtual void Bersuara(): Kata kunci virtual memberi izin kepada setiap turunan untuk mengganti isi method ini.
  2. public override void Bersuara() pada Kucing: Implementasi Kucing menggantikan versi Hewan, sehingga object kucing mencetak Kucing: Meong!.
  3. public override void Bersuara() pada Sapi: Turunan kedua mengganti dengan perilaku lain, dan object sapi mencetak Sapi: Moo!.
  4. Tiga pemanggilan Bersuara(): Nama method sama, tetapi isi yang berjalan mengikuti tipe object masing-masing; object hewanUmum yang bertipe Hewan tetap memakai versi aslinya.

Memanggil Versi Asli dengan base #

Turunan kadang perlu menjalankan perilaku asli terlebih dahulu, lalu menambahkan sesuatu. Kata kunci base memanggil implementasi milik base class:

csharp
public class Anjing : Hewan
{
    public override void Bersuara()
    {
        base.Bersuara();
        Console.WriteLine("Anjing: Guk!");
    }
}

Anjing anjing = new Anjing();
anjing.Bersuara();

Output yang Dihasilkan:

text
Hewan mengeluarkan suara.
Anjing: Guk!

Baris base.Bersuara(); menjalankan versi Hewan terlebih dahulu, sehingga output memuat dua baris.

Aturan Penting Override #

Empat aturan berikut menjaga override tetap konsisten:

  • Signature method yang di-override wajib sama persis: nama, daftar parameter, dan return type tidak boleh berubah.
  • Visibility versi override tidak boleh lebih ketat daripada versi base; method public di base tetap public di turunan.
  • Override tidak mengubah method base; kode lain yang memakai object Hewan langsung tetap menjalankan versi aslinya.
  • Turunan berikutnya boleh meng-override lagi, karena method hasil override tetap virtual; kata kunci sealed dapat menghentikan rantai ini bila diperlukan.
text
error CS0506: 'Burung.Terbang()': cannot override inherited member 'Hewan.Terbang()' because it is not marked virtual, abstract, or override

Dengan virtual, override, dan base, setiap turunan kini mengatur perilakunya sendiri. Bab berikutnya memanfaatkan kemampuan ini lewat satu reference bertipe dasar.