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ışırDowncasting, 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.
Görev
KolayKalı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:Vehiclead alanında temel birInspectionsınıfı tanımlayın. Her aracın, bir kurucu aracılığıyla ayarlanan birLicensePlateözelliği (string) vardır.GetBasicInfo()değerini döndüren"Vehicle: {LicensePlate}"adlı bir yöntem ekleyin.Car.cs:Carad alanındaInspectionsınıfından kalıtım alan birVehiclesınıfı tanımlayın. Arabalarda ek olarak birNumberOfDoorsö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:Motorcyclead alanındaInspectionsınıfından kalıtım alan birVehiclesınıfı tanımlayın. Motosikletlerde birHasSidecarö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 birCarve birMotorcycleoluşturun, ardından her ikisini deVehiclebaş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 birlikteisanahtar sözcüğünü kullanın: araç birCariseHonk()çağrısını, birMotorcycleiseRev()çağrısını yapın.
Dört girdi alacaksınız:
- Arabanın plakası
- Kapı sayısı
- Motosikletin plakası
- Sepet var mı (
trueveyafalse)
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
}
}
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ıKendi başına pratik yap: Online C# derleyicisi