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ışırDowncasting 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.
Görev
KolayKalı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:Inspectionad alanı (namespace) içinde bir temelVehiclesınıfı tanımlayın. Her aracın, bir yapıcı (constructor) aracılığıyla ayarlanan birLicensePlateözelliği (string) vardır."Vehicle: {LicensePlate}"değerini döndürenGetBasicInfo()adlı bir metot ekleyin.Car.cs:Inspectionad alanı içindeVehiclesınıfından kalıtım alan birCarsınıfı tanımlayın. Arabaların ek birNumberOfDoorsö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ürenHonk()adlı bir metot ekleyin.Motorcycle.cs:Inspectionad alanı içindeVehiclesınıfından kalıtım alan birMotorcyclesınıfı tanımlayın. Motosikletlerin birHasSidecarözelliği (bool) vardır. Yapıcı, plaka ve sepet durumunu kabul eder."{LicensePlate} revs: Vroom!"değerini döndürenRev()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 birCarve birMotorcycleoluşturun, ardından her ikisini de birVehiclereferans 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) ileisanahtar kelimesini kullanın: eğer birCariseHonk()metodunu çağırın; eğer birMotorcycleiseRev()metodunu çağırın.
Dört giriş alacaksınız:
- Araba plakası
- Kapı sayısı
- Motosiklet plakası
- Sepet var mı (
trueveyafalse)
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ışırDowncasting 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
}
}
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ı