Menu
Coddy logo textTech

Upcasting ve Downcasting

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 29 / 70.

Kalıtım hiyerarşileriyle çalışırken, genellikle temel türler ve türetilmiş türler arasında dönüşüm yapmanız gerekir. Üst türe dönüştürme, türetilmiş bir türü temel türüne dönüştürürken alt türe dönüştürme bunun tersini yapar.

Yukarı dönüştürme örtüktür ve her zaman güvenlidir; çünkü türetilmiş bir sınıfın, temel sınıfın sahip olduğu her şeye sahip olduğu garanti edilir:

Dog myDog = new Dog();
Animal animal = myDog;  // Upcasting - örtük, her zaman çalışır

Downcasting, açık bir dönüştürme gerektirir ve nesne gerçekten dönüştürmeye çalıştığınız tür değilse çalışma zamanında başarısız olabilir:

Animal animal = new Dog();
Dog dog = (Dog)animal;  // Downcasting - çalışır çünkü o aslında bir Dog nesnesidir

Animal cat = new Cat();
Dog wrong = (Dog)cat;   // InvalidCastException fırlatır!

Güvenli bir alt türe dönüştürme işlemi için önce türü kontrol etmek üzere is anahtar sözcüğünü kullanın veya istisna oluşturmak yerine null döndüren as ifadesini kullanın:

if (animal is Dog d)
{
    d.Bark();  // Güvenli - d yalnızca kontrol başarılı olursa kullanılabilir
}

Dog maybeDog = animal as Dog;
if (maybeDog != null)
{
    maybeDog.Bark();
}

Modern C#'ta is desen eşleştirme yaklaşımı tercih edilir; çünkü tür denetimini ve dönüştürmeyi tek bir adımda birleştirerek kodunuzu hem daha güvenli hem de daha temiz hale getirir.

challenge icon

Görev

Kolay

Kalıtım hiyerarşisindeki nesnelerle esnek bir şekilde çalışmanızı sağlayan upcasting ve downcasting işlemlerini gösteren bir araç denetim sistemi oluşturalım. Farklı araç türleri oluşturacak ve belirli araç türlerini güvenli bir şekilde tanımlayıp bunlarla etkileşim kuran kodlar yazacaksınız.

Kodunuzu dört dosyaya ayıracaksınız:

  • Vehicle.cs: Vehicle ad alanında temel bir Inspection sınıfı tanımlayın. Her aracın, bir kurucu aracılığıyla ayarlanan bir LicensePlate özelliği (string) vardır. GetBasicInfo() değerini döndüren "Vehicle: {LicensePlate}" adlı bir yöntem ekleyin.
  • Car.cs: Car ad alanında Inspection sınıfından kalıtım alan bir Vehicle sınıfı tanımlayın. Arabalarda ek olarak bir NumberOfDoors özelliği (int) bulunur. Kurucu, plaka ve kapı sayısını kabul eder. Honk() değerini döndüren "{LicensePlate} honks: Beep beep!" adlı bir yöntem ekleyin.
  • Motorcycle.cs: Motorcycle ad alanında Inspection sınıfından kalıtım alan bir Vehicle sınıfı tanımlayın. Motosikletlerde bir HasSidecar özelliği (bool) bulunur. Kurucu, plakayı ve sepet durumunu kabul eder. Rev() değerini döndüren "{LicensePlate} revs: Vroom!" adlı bir yöntem ekleyin.
  • Program.cs: Ana dosyanızda araçlar oluşturacak ve hem upcasting hem de güvenli downcasting işlemlerini uygulayacaksınız. Girdi değerlerini kullanarak bir Car ve bir Motorcycle oluşturun, ardından her ikisini de Vehicle başvurularından oluşan bir dizide saklayın (upcasting). Dizi üzerinde döngü kurun ve her araç için temel bilgilerini yazdırın. Ardından güvenli bir downcasting işlemi yapmak için desen eşleştirmeyle birlikte is anahtar sözcüğünü kullanın: araç bir Car ise Honk() çağrısını, bir Motorcycle ise Rev() çağrısını yapın.

Dört girdi alacaksınız:

  • Arabanın plakası
  • Kapı sayısı
  • Motosikletin plakası
  • Sepet var mı (true veya false)

Dizideki her araç için çıktıyı şu biçimde yazdırın:

{GetBasicInfo() result}
{Honk() or Rev() result based on actual type}

Örneğin girdiler ABC-123, 4, XYZ-789 ve false ise çıktı şu şekilde olmalıdır:

Vehicle: ABC-123
ABC-123 honks: Beep beep!
Vehicle: XYZ-789
XYZ-789 revs: Vroom!

Tüm araçların Vehicle başvuruları olarak saklandığına (upcasting), ancak downcasting için is desen eşleştirme söz dizimini kullanarak gerçek türlerini güvenli bir şekilde belirleyip türe özgü yöntemlere erişebildiğinize dikkat edin!

Kendin dene

using System;
using Inspection;

class Program
{
    public static void Main(string[] args)
    {
        // Girdileri oku
        string carPlate = Console.ReadLine();
        int numberOfDoors = Convert.ToInt32(Console.ReadLine());
        string motorcyclePlate = Console.ReadLine();
        bool hasSidecar = Convert.ToBoolean(Console.ReadLine());
        
        // TODO: carPlate ve numberOfDoors kullanarak bir Car nesnesi oluşturun
        
        // TODO: motorcyclePlate ve hasSidecar kullanarak bir Motorcycle nesnesi oluşturun
        
        // TODO: Her iki aracı da içeren bir Vehicle referans dizisi oluşturun (upcasting)
        
        // TODO: Dizi üzerinde döngü kurun ve her araç için:
        //   - GetBasicInfo() sonucunu yazdırın
        //   - Güvenli bir şekilde downcast yapmak için desen eşleştirme ile 'is' anahtar kelimesini kullanın:
        //     - Eğer bir Car ise, Honk() metodunu çağırın ve yazdırın
        //     - Eğer bir Motorcycle ise, Rev() metodunu çağırın ve yazdırın
    }
}
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