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 ve türetilmiş türler arasında dönüştürme yapmanız gerekir. Upcasting, türetilmiş bir türü temel türüne dönüştürürken, downcasting bunun tam tersini yapar.

Upcasting ö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 olması garanti edilir:

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

Downcasting açık bir tür dönüşümü gerektirir ve nesne aslında dönüştürmeye çalıştığınız türde değilse çalışma zamanında hata verebilir:

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 şekilde downcast yapmak için, önce türü kontrol etmek üzere is anahtar kelimesini kullanın veya bir istisna fırlatmak yerine null döndüren as anahtar kelimesini 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ıza olanak tanıyan upcasting (yukarı çevrim) ve downcasting (aşağı çevrim) kavramlarını gösteren bir araç muayene sistemi oluşturalım. Farklı araç türleri oluşturacak ve belirli araç türlerini güvenli bir şekilde tanımlayan ve onlarla etkileşime giren kodlar yazacaksınız.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Vehicle.cs: Inspection ad alanı (namespace) içinde bir temel Vehicle sınıfı tanımlayın. Her aracın, bir yapıcı (constructor) aracılığıyla ayarlanan bir LicensePlate özelliği (string) vardır. "Vehicle: {LicensePlate}" değerini döndüren GetBasicInfo() adlı bir metot ekleyin.
  • Car.cs: Inspection ad alanı içinde Vehicle sınıfından kalıtım alan bir Car sınıfı tanımlayın. Arabaların ek bir NumberOfDoors özelliği (int) vardır. Yapıcı, hem plaka hem de kapı sayısını kabul eder. "{LicensePlate} honks: Beep beep!" değerini döndüren Honk() adlı bir metot ekleyin.
  • Motorcycle.cs: Inspection ad alanı içinde Vehicle sınıfından kalıtım alan bir Motorcycle sınıfı tanımlayın. Motosikletlerin bir HasSidecar özelliği (bool) vardır. Yapıcı, plaka ve sepet durumunu kabul eder. "{LicensePlate} revs: Vroom!" değerini döndüren Rev() adlı bir metot ekleyin.
  • Program.cs: Ana dosyanızda araçlar oluşturacak, upcasting ve güvenli downcasting pratikleri yapacaksınız. Giriş değerlerini kullanarak bir Car ve bir Motorcycle oluşturun, ardından her ikisini de bir Vehicle referans dizisinde saklayın (upcasting). Dizide döngü kurun ve her araç için temel bilgilerini yazdırın. Ardından, güvenli bir şekilde downcasting yapmak için desen eşleştirme (pattern matching) ile is anahtar kelimesini kullanın: eğer bir Car ise Honk() metodunu çağırın; eğer bir Motorcycle ise Rev() metodunu çağırın.

Dört giriş alacaksınız:

  • Araba plakası
  • Kapı sayısı
  • Motosiklet plakası
  • Sepet var mı (true veya false)

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

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

Örneğin, girişler ABC-123, 4, XYZ-789 ve false ise çıktı şöyle olmalıdır:

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

Tüm araçların Vehicle referansları olarak nasıl saklandığına (upcasting) dikkat edin, ancak downcasting için is desen eşleştirme söz dizimini kullanarak gerçek türlerini güvenli bir şekilde keşfedebilir ve türe özgü metotlara erişebilirsiniz!

Kopya kağıdı

Kalıtım hiyerarşileriyle çalışırken, upcasting türetilmiş bir türü temel türüne dönüştürür, downcasting ise temel bir türü türetilmiş bir türe dönüştürür.

Upcasting örtüktür (implicit) ve her zaman güvenlidir:

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

Downcasting açık bir dönüştürme (explicit cast) gerektirir ve ç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

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

Desen eşleştirme (pattern matching) ile is anahtar kelimesini kullanarak güvenli downcasting (tercih edilen):

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

as anahtar kelimesini kullanarak güvenli downcasting (dönüştürme başarısız olursa null döner):

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

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