Method warisan dari bab sebelumnya berperilaku sama untuk semua turunan. Padahal dalam dunia hewan, setiap jenis burung bersuara berbeda, dan memaksa semua turunan menjalankan pesan generik membuat program kurang bermakna. Kata kunci virtual menandai method base class yang boleh diganti, sedangkan override menyatakan penggantian pada derived class. Section Pemrograman Berorientasi Objek telah memperkenalkan pasangan ini; bab ini membedah mekanismenya lebih jauh, termasuk rantai override antar generasi turunan.
Pasangan virtual dan override #
Method yang boleh diganti wajib ditandai virtual di base class. Derived class kemudian menulis versi penggantinya dengan override, dan kedua versi wajib memiliki nama, parameter, serta return type yang sama. Compiler memeriksa kecocokan pasangan tersebut pada waktu kompilasi, sedangkan pemilihan versi yang benar-benar dijalankan terjadi pada saat program berjalan.
Contoh: Rantai Override Tiga Level #
public class Hewan
{
public virtual void Bersuara()
{
Console.WriteLine("Hewan mengeluarkan suara.");
}
}
public class Burung : Hewan
{
public override void Bersuara()
{
Console.WriteLine("Burung: Cip cip!");
}
}
public class Perkutut : Burung
{
public override void Bersuara()
{
Console.WriteLine("Perkutut: Kur kur!");
}
}
Hewan hewan = new Hewan();
hewan.Bersuara();
Burung burung = new Burung();
burung.Bersuara();
Perkutut perkutut = new Perkutut();
perkutut.Bersuara();Output yang Dihasilkan:
Hewan mengeluarkan suara.
Burung: Cip cip!
Perkutut: Kur kur!Mari kita bedah baris demi baris:
public virtual void Bersuara(): Kata kuncivirtualmemberi izin kepada setiap turunanHewanuntuk mengganti isi method ini.public override void Bersuara()padaBurung: VersiBurungmenggantikan versiHewan, sehingga output baris kedua berasal dariBurung.public override void Bersuara()padaPerkutut:PerkututmewarisiBurung, dan method hasil override tetap virtual, sehingga rantai penggantian dapat berlanjut ke generasi berikutnya.- Tiga pemanggilan
Bersuara(): Setiap object menjalankan versi terdekat dalam rantai turunannya;perkututmemakai versiPerkutut, bukan versiBurungatauHewan.
Memperluas Implementasi dengan base #
Turunan kadang perlu menjalankan versi base class terlebih dahulu, lalu menambahkan perilaku sendiri:
public class Beo : Burung
{
public override void Bersuara()
{
base.Bersuara();
Console.WriteLine("Beo menirukan suara manusia.");
}
}
Beo beo = new Beo();
beo.Bersuara();Output yang Dihasilkan:
Burung: Cip cip!
Beo menirukan suara manusia.Baris base.Bersuara(); menjalankan versi Burung sebelum baris tambahan dicetak, sehingga output memuat dua baris. Pola ini cocok untuk perilaku berlapis seperti pencatatan sebelum aksi utama.
Empat aturan menjaga override tetap konsisten: signature wajib sama persis, visibility versi override tidak boleh lebih ketat daripada versi base, hanya member virtual/abstract/override yang boleh di-override, dan method hasil override tetap virtual untuk turunan berikutnya. Bab tentang sealed members menunjukkan cara menghentikan rantai tersebut.