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 #

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

text
Mobil diperiksa di bengkel resmi.
Kendaraan menjalani servis rutin.

Mari kita bedah baris demi baris:

  1. public void Servis() pada Kendaraan: Method ini method biasa tanpa virtual, sehingga tidak menyediakan jalur penggantian ke turunan.
  2. public new void Servis(): Kata kunci new menyatakan bahwa Mobil sengaja menyembunyikan Servis() milik Kendaraan dengan versi barunya.
  3. mobil.Servis(): Reference bertipe Mobil menjalankan versi hiding, sehingga output baris pertama berasal dari Mobil.
  4. Kendaraan kendaraan = mobil;: Satu object yang sama kini dipandang melalui reference bertipe Kendaraan.
  5. kendaraan.Servis(): Pemilihan versi mengikuti tipe reference, sehingga versi Kendaraan yang berjalan; dua baris output berasal dari object yang sama.

new versus override #

Tabel berikut merangkum perbedaan kedua mekanisme:

Aspeknew (hiding)override
Tanda di base classTidak wajib apa punWajib virtual atau abstract
Versi yang dijalankanMengikuti tipe referenceMengikuti tipe object
Hubungan versiDua method terpisah yang berdampinganSatu method dengan implementasi diganti
text
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.