Bengkel memiliki class Kendaraan yang method Servis() sudah dipakai banyak modul lain. Developer ingin class Mobil memiliki versi servis sendiri tanpa menyentuh base class, misalnya karena Kendaraan berasal dari pustaka yang tidak boleh diubah. Menandai virtual di base class bukan pilihan, dan mengganti nama method juga mengubah kode pemanggil. Kata kunci new pada deklarasi member derived class menyelesaikan situasi ini melalui mekanisme method hiding: member baru menyembunyikan member warisan yang namanya sama.
Method Hiding dengan new #
Method hiding berbeda dari overriding pada satu poin penting: versi yang dijalankan mengikuti tipe reference, bukan tipe object. Reference bertipe Mobil menjalankan versi Mobil, sedangkan reference bertipe Kendaraan yang menunjuk object Mobil tetap menjalankan versi Kendaraan. Sifat inilah yang membedakan hiding dari override pada bab sebelumnya, di mana versi mengikuti tipe object.
Contoh: Servis di Dua Tipe Reference #
public class Kendaraan
{
public void Servis()
{
Console.WriteLine("Kendaraan menjalani servis rutin.");
}
}
public class Mobil : Kendaraan
{
public new void Servis()
{
Console.WriteLine("Mobil diperiksa di bengkel resmi.");
}
}
Mobil mobil = new Mobil();
mobil.Servis();
Kendaraan kendaraan = mobil;
kendaraan.Servis();Output yang Dihasilkan:
Mobil diperiksa di bengkel resmi.
Kendaraan menjalani servis rutin.Mari kita bedah baris demi baris:
public void Servis()padaKendaraan: Method ini method biasa tanpavirtual, sehingga tidak menyediakan jalur penggantian ke turunan.public new void Servis(): Kata kuncinewmenyatakan bahwaMobilsengaja menyembunyikanServis()milikKendaraandengan versi barunya.mobil.Servis(): Reference bertipeMobilmenjalankan versi hiding, sehingga output baris pertama berasal dariMobil.Kendaraan kendaraan = mobil;: Satu object yang sama kini dipandang melalui reference bertipeKendaraan.kendaraan.Servis(): Pemilihan versi mengikuti tipe reference, sehingga versiKendaraanyang berjalan; dua baris output berasal dari object yang sama.
new versus override #
Tabel berikut merangkum perbedaan kedua mekanisme:
| Aspek | new (hiding) | override |
|---|---|---|
| Tanda di base class | Tidak wajib apa pun | Wajib virtual atau abstract |
| Versi yang dijalankan | Mengikuti tipe reference | Mengikuti tipe object |
| Hubungan versi | Dua method terpisah yang berdampingan | Satu method dengan implementasi diganti |
warning CS0108: 'Mobil.Servis()' hides inherited member 'Kendaraan.Servis()'. Use the new keyword if hiding was intended.Peringatan ini mengingatkan kita untuk menyatakan maksud secara eksplisit; tulis new bila memang sengaja hiding, atau override bila base class menyediakan virtual. Perlu dicatat juga bahwa new pada konteks ini sama sekali berbeda dari operator new yang membuat object baru.
Bab berikutnya membahas abstract members, mekanisme yang memaksa turunan mengisi implementasi alih-alih sekadar menggantinya.