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.
Tantangan
MudahMari 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 classNotificationdalam namespaceAlerts. Class dasar ini mewakili notifikasi umum dengan propertyMessage(string) dan konstruktor yang menetapkan nilainya. Sertakan methodvirtualbernamaSend()yang mengembalikan"Sending notification: {Message}".EmailNotification.cs: Definisikan classEmailNotificationdalam namespaceAlertsyang mewarisiNotification. Tambahkan propertyRecipient(string) dan konstruktor yang menerima message dan recipient (gunakanbaseuntuk meneruskan message). Ganti methodSend()agar mengembalikan"Emailing {Recipient}: {Message}".SmsNotification.cs: Definisikan classSmsNotificationdalam namespaceAlertsyang juga mewarisiNotification. Tambahkan propertyPhoneNumber(string) dan konstruktor yang menerima message dan nomor telepon. Ganti methodSend()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 bertipeNotificationdan memanggilSend()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 3pmPerhatikan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online