Menu
CoddyTech

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.

challenge icon

Görev

Kolay

virtual 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: Alerts ad alanında bir Notification sı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üren Send() adlı bir virtual metot ekleyin.
  • EmailNotification.cs: Alerts ad alanında, Notification sınıfından kalıtım alan bir EmailNotification sınıfı tanımlayın. Bir Recipient özelliği (string) ve hem mesajı hem de alıcıyı kabul eden bir oluşturucu ekleyin (mesajı iletmek için base kullanın). Send() metodunu geçersiz kılarak "Emailing {Recipient}: {Message}" döndürmesini sağlayın.
  • SmsNotification.cs: Alerts ad alanında, yine Notification sınıfından kalıtım alan bir SmsNotification sınıfı tanımlayın. Bir PhoneNumber ö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ü de Notification değişkenlerinde saklayıp her biri üzerinde Send() 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
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C# derleyicisi