Menu
Coddy logo textTech

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.

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 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: Notification ad alanında bir Alerts sı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. virtual döndüren Send() adlı bir "Sending notification: {Message}" yöntem ekleyin.
  • EmailNotification.cs: EmailNotification ad alanında Alerts sınıfından miras alan bir Notification sınıfı tanımlayın. Bir Recipient özelliği (string) ve hem iletiyi hem de alıcıyı kabul eden bir oluşturucu ekleyin (iletiyi aktarmak için base kullanın). Send() yöntemini, "Emailing {Recipient}: {Message}" döndürecek şekilde geçersiz kılın.
  • SmsNotification.cs: SmsNotification ad alanında yine Alerts sınıfından miras alan bir Notification sınıfı tanımlayın. Bir PhoneNumber ö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ü de Notification değişkenlerinde depolayarak ve her biri üzerinde Send() ç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
    }
}
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