Virtual ve Override Anahtar Kelimeleri
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 21 / 70.
Türetilmiş bir sınıf bir metodu devraldığında, bazen bu metodun davranışını tamamen değiştirmek isteyebilirsin. virtual ve override anahtar sözcükleri, bunu kontrollü bir şekilde mümkün kılmak için birlikte çalışır.
Türetilmiş sınıfların bir yöntemin uygulamasını değiştirmesine izin verildiğini belirtmek için temel sınıftaki yöntemi virtual olarak işaretle:
public class Animal
{
public virtual void Speak()
{
Console.WriteLine("Some sound");
}
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Woof!");
}
}Türetilmiş sınıftaki override anahtar sözcüğü, derleyiciye temel sınıf yöntemini kasıtlı olarak değiştirdiğinizi söyler. Temel sınıf yönteminde virtual yoksa override kullanamazsınız.
Asıl güç, türetilmiş bir nesneyi tutmak için temel sınıf başvurusu kullandığınızda ortaya çıkar:
Animal myPet = new Dog();
myPet.Speak(); // Çıktı: Woof!myPet, Animal olarak bildirilmiş olsa da C#, Speak() metodunun Dog sürümünü çağırır. Buna çalışma zamanı çok biçimliliği denir: çağrılan gerçek metot, değişkenin bildirilmiş türüne değil, nesnenin gerçek türüne bağlıdır.
Davranışı tamamen değiştirmek yerine genişletmek istiyorsanız, override metodunuzun içinde base.Speak() kullanarak temel uygulamaya erişmeye devam edebilirsiniz.
Görev
Kolayvirtual ve override anahtar sözcüklerini kullanarak türetilmiş sınıfların temel sınıf davranışını nasıl tamamen geçersiz kılabileceğini gösteren ve çalışma zamanı polimorfizminin gücünü de ortaya koyan bir bildirim sistemi oluşturalım.
Kodunuzu düzenlemek için üç dosya oluşturacaksınız:
Notification.cs:Alertsad alanında birNotificationsınıfı tanımlayın. Bu temel sınıf,Messageözelliğine (string) ve bu özelliğe değer atayan bir oluşturucuya sahip genel bir bildirimi temsil eder."Sending notification: {Message}"döndürenSend()adlı birvirtualmetot ekleyin.EmailNotification.cs:Alertsad alanında,Notificationsınıfından kalıtım alan birEmailNotificationsınıfı tanımlayın. BirRecipientözelliği (string) ve hem mesajı hem de alıcıyı kabul eden bir oluşturucu ekleyin (mesajı iletmek içinbasekullanın).Send()metodunu geçersiz kılarak"Emailing {Recipient}: {Message}"döndürmesini sağlayın.SmsNotification.cs:Alertsad alanında, yineNotificationsınıfından kalıtım alan birSmsNotificationsınıfı tanımlayın. BirPhoneNumberözelliği (string) ve hem mesajı hem de telefon numarasını kabul eden bir oluşturucu ekleyin.Send()metodunu geçersiz kılarak"SMS to {PhoneNumber}: {Message}"döndürmesini sağlayın.Program.cs: Ana dosyanızda, girdi değerlerini kullanarak üç bildirim türünün de örneklerini oluşturun. Ardından üçünü deNotificationdeğişkenlerinde saklayıp her biri üzerindeSend()metodunu çağırarak çalışma zamanı polimorfizmini gösterin.
Dört girdi alacaksınız:
- Bildirim mesajı
- E-posta alıcısının adresi
- SMS için telefon numarası
Temel sınıf başvuruları olarak saklanan her bildirimin Send() metodunu çağırmanın sonucunu yazdırın:
{base notification Send() result}
{email notification Send() result}
{sms notification Send() result}Örneğin, girdiler Meeting at 3pm, alice@email.com ve 555-1234 ise çıktı şöyle olmalıdır:
Sending notification: Meeting at 3pm
Emailing alice@email.com: Meeting at 3pm
SMS to 555-1234: Meeting at 3pmÜçü de Notification değişkenlerinde saklanmasına rağmen her birinin kendi geçersiz kılınmış Send() sürümünü çağırdığına dikkat edin. İşte çalışma zamanı polimorfizmi budur!
Kendin dene
using System;
using Alerts;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string message = Console.ReadLine();
string email = Console.ReadLine();
string phone = Console.ReadLine();
// TODO: Üç bildirim türünün de örneklerini oluştur
// Çok biçimliliği göstermek için bunları Notification değişkenlerinde sakla
// TODO: Temel bir Notification oluştur
Notification baseNotification;
// TODO: Bir EmailNotification oluştur (Notification türünde saklanacak)
Notification emailNotification;
// TODO: Bir SmsNotification oluştur (Notification türünde saklanacak)
Notification smsNotification;
// TODO: Her biri için Send() metodunu çağır ve sonuçları yazdır
// Çalışma zamanı çok biçimliliği sayesinde geçersiz kılınan metotlar çağrılacak
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi