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 #
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:
Hewan mengeluarkan suara.
Kucing: Meong!
Sapi: Moo!Mari kita bedah baris demi baris:
public virtual void Bersuara(): Kata kuncivirtualmemberi izin kepada setiap turunan untuk mengganti isi method ini.public override void Bersuara()padaKucing: ImplementasiKucingmenggantikan versiHewan, sehingga objectkucingmencetakKucing: Meong!.public override void Bersuara()padaSapi: Turunan kedua mengganti dengan perilaku lain, dan objectsapimencetakSapi: Moo!.- Tiga pemanggilan
Bersuara(): Nama method sama, tetapi isi yang berjalan mengikuti tipe object masing-masing; objecthewanUmumyang bertipeHewantetap 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:
public class Anjing : Hewan
{
public override void Bersuara()
{
base.Bersuara();
Console.WriteLine("Anjing: Guk!");
}
}
Anjing anjing = new Anjing();
anjing.Bersuara();Output yang Dihasilkan:
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
publicdi base tetappublicdi turunan. - Override tidak mengubah method base; kode lain yang memakai object
Hewanlangsung tetap menjalankan versi aslinya. - Turunan berikutnya boleh meng-override lagi, karena method hasil override tetap virtual; kata kunci
sealeddapat menghentikan rantai ini bila diperlukan.
error CS0506: 'Burung.Terbang()': cannot override inherited member 'Hewan.Terbang()' because it is not marked virtual, abstract, or overrideDengan virtual, override, dan base, setiap turunan kini mengatur perilakunya sendiri. Bab berikutnya memanfaatkan kemampuan ini lewat satu reference bertipe dasar.