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 miras aldığında, bazen o metodun nasıl davranacağını tamamen değiştirmek istersiniz. virtual ve override anahtar kelimeleri, bunu kontrollü bir şekilde mümkün kılmak için birlikte çalışır.
Türetilmiş sınıfların bir metodun uygulamasını değiştirmesine izin verildiğini belirtmek için temel sınıfta o metodu virtual olarak işaretleyin:
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 kelimesi, derleyiciye temel metodu kasıtlı olarak geçersiz kıldığınızı söyler. Temel metotta virtual olmadan override kullanamazsınız.
Asıl güç, türetilmiş bir nesneyi tutmak için bir temel sınıf referansı kullandığınızda ortaya çıkar:
Animal myPet = new Dog();
myPet.Speak(); // Çıktı: Woof!myPet Animal olarak bildirilmiş olsa da C#, Speak() yönteminin Dog sürümünü çağırır. Buna çalışma zamanı çok biçimliliği denir - çağrılan gerçek yöntem, değişkenin bildirilen türüne değil, nesnenin gerçek türüne bağlıdır.
Davranışı tamamen değiştirmek yerine genişletmek istersen, geçersiz kıldığın metot içinde base.Speak() kullanarak temel uygulamaya yine erişebilirsin.
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 ve çalışma zamanı çok biçimliliğinin gücünü gösteren bir bildirim sistemi oluşturalım.
Kodunuzu düzenlemek için üç dosya oluşturacaksınız:
Notification.cs:Notificationad alanında birAlertssınıfı tanımlayın. Bu temel sınıf,Messageözelliğine (string) ve bu özelliği ayarlayan bir oluşturucuya sahip genel bir bildirimi temsil eder.virtualdöndürenSend()adlı bir"Sending notification: {Message}"yöntem ekleyin.EmailNotification.cs:EmailNotificationad alanındaAlertssınıfından miras alan birNotificationsınıfı tanımlayın. BirRecipientözelliği (string) ve hem iletiyi hem de alıcıyı kabul eden bir oluşturucu ekleyin (iletiyi aktarmak içinbasekullanın).Send()yöntemini,"Emailing {Recipient}: {Message}"döndürecek şekilde geçersiz kılın.SmsNotification.cs:SmsNotificationad alanında yineAlertssınıfından miras alan birNotificationsınıfı tanımlayın. BirPhoneNumberözelliği (string) ve hem iletiyi hem de telefon numarasını kabul eden bir oluşturucu ekleyin.Send()yöntemini,"SMS to {PhoneNumber}: {Message}"döndürecek şekilde geçersiz kılı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 depolayarak ve her biri üzerindeSend()çağrısı yaparak çalışma zamanı çok biçimliliğini gösterin.
Dört girdi alacaksınız:
- Bildirim iletisi
- E-posta alıcısının adresi
- SMS için telefon numarası
Temel sınıf başvuruları olarak depolanan her bildirim üzerinde Send() çağrısını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 depolanmış olsa bile her birinin kendi geçersiz kılınmış Send() sürümünü çağırdığına dikkat edin. İşte çalışma zamanı çok biçimliliği 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şturun
// Polimorfizmi (çok biçimlilik) göstermek için bunları Notification değişkenlerinde saklayın
// TODO: Temel bir Notification oluşturun
Notification baseNotification;
// TODO: Bir EmailNotification oluşturun (Notification türünde saklanan)
Notification emailNotification;
// TODO: Bir SmsNotification oluşturun (Notification türünde saklanan)
Notification smsNotification;
// TODO: Her biri üzerinde Send() metodunu çağırın ve sonuçları yazdırın
// Çalışma zamanı polimorfizmi nedeniyle geçersiz kılınan (overridden) metotlar çağrılacaktır
}
}
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