Menu
CoddyTech

Kata Kunci Virtual & Override

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 21 dari 70.

Saat sebuah class turunan mewarisi method, terkadang kamu ingin mengubah sepenuhnya perilaku method tersebut. Kata kunci virtual dan override bekerja sama agar hal ini bisa dilakukan dengan cara yang terkendali.

Tandai sebuah method sebagai virtual di dalam class dasar untuk menunjukkan bahwa class turunan boleh mengganti implementasinya:

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Some sound");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

Kata kunci override di derived class memberi tahu compiler bahwa kamu memang sengaja mengganti method dari base class. Tanpa virtual pada method dari base class, kamu tidak dapat menggunakan override.

Kekuatan sesungguhnya terlihat saat kamu menggunakan referensi base class untuk menyimpan object turunan:

Animal myPet = new Dog();
myPet.Speak();  // output: Woof!

Meskipun myPet dideklarasikan sebagai Animal, C# memanggil versi Dog dari Speak(). Ini disebut polimorfisme saat runtime: method yang sebenarnya dipanggil bergantung pada tipe sebenarnya dari object, bukan tipe yang dideklarasikan untuk variabel.

Kamu tetap dapat mengakses implementasi dasar menggunakan base.Speak() di dalam override-mu jika kamu ingin memperluas perilakunya, bukan menggantinya sepenuhnya.

challenge icon

Tantangan

Mudah

Mari kita buat sistem notifikasi yang menunjukkan cara class turunan dapat sepenuhnya mengganti perilaku class dasar menggunakan kata kunci virtual dan override, sekaligus menunjukkan kekuatan polimorfisme saat runtime.

Kamu akan membuat tiga file untuk mengatur kodemu:

  • Notification.cs: Definisikan class Notification dalam namespace Alerts. Class dasar ini mewakili notifikasi umum dengan property Message (string) dan konstruktor yang menetapkan nilainya. Sertakan method virtual bernama Send() yang mengembalikan "Sending notification: {Message}".
  • EmailNotification.cs: Definisikan class EmailNotification dalam namespace Alerts yang mewarisi Notification. Tambahkan property Recipient (string) dan konstruktor yang menerima message dan recipient (gunakan base untuk meneruskan message). Ganti method Send() agar mengembalikan "Emailing {Recipient}: {Message}".
  • SmsNotification.cs: Definisikan class SmsNotification dalam namespace Alerts yang juga mewarisi Notification. Tambahkan property PhoneNumber (string) dan konstruktor yang menerima message dan nomor telepon. Ganti method Send() agar mengembalikan "SMS to {PhoneNumber}: {Message}".
  • Program.cs: Di file utama, buat instance dari ketiga tipe notifikasi menggunakan nilai input. Lalu, tunjukkan polimorfisme saat runtime dengan menyimpan ketiganya dalam variabel bertipe Notification dan memanggil Send() pada masing-masing.

Kamu akan menerima empat input:

  • Pesan notifikasi
  • Alamat penerima email
  • Nomor telepon untuk SMS

Cetak hasil pemanggilan Send() pada setiap notifikasi yang disimpan sebagai referensi class dasar:

{base notification Send() result}
{email notification Send() result}
{sms notification Send() result}

Misalnya, jika inputnya adalah Meeting at 3pm, alice@email.com, dan 555-1234, outputnya seharusnya:

Sending notification: Meeting at 3pm
Emailing alice@email.com: Meeting at 3pm
SMS to 555-1234: Meeting at 3pm

Perhatikan bahwa meskipun ketiganya disimpan sebagai variabel Notification, masing-masing memanggil versinya sendiri yang telah mengganti Send(). Itulah polimorfisme saat runtime!

Coba sendiri

using System;
using Alerts;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        string message = Console.ReadLine();
        string email = Console.ReadLine();
        string phone = Console.ReadLine();

        // TODO: Buat instance dari ketiga jenis notifikasi
        // Simpan semuanya dalam variabel Notification untuk menunjukkan polimorfisme
        
        // TODO: Buat Notification dasar
        Notification baseNotification;
        
        // TODO: Buat EmailNotification (disimpan sebagai tipe Notification)
        Notification emailNotification;
        
        // TODO: Buat SmsNotification (disimpan sebagai tipe Notification)
        Notification smsNotification;
        
        // TODO: Panggil Send() pada masing-masing dan cetak hasilnya
        // Method yang ditimpa akan dipanggil karena polimorfisme saat program berjalan
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online