Derleme vs Çalışma Zamanı Polimorfizmi
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 70.
Polimorfizm "çok biçimlilik" anlamına gelir - aynı kodun bağlama bağlı olarak farklı davranma yeteneğidir. C# iki farklı polimorfizm türünü destekler ve her birinin ne zaman çözümlendiğini anlamak, daha esnek kodlar yazmanıza yardımcı olur.
Derleme zamanı polimorfizmi (statik polimorfizm olarak da adlandırılır), programınız çalışmadan önce derleyici tarafından çözülür. Metot aşırı yükleme bunun başlıca örneğidir — birden fazla metot aynı adı paylaşır, ancak farklı parametrelere sahiptir:
public class Calculator
{
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
}
var calc = new Calculator();
calc.Add(5, 3); // Derleyici int sürümünü seçer
calc.Add(5.0, 3.0); // Derleyici double sürümünü seçerDerleyici, argüman türlerini inceler ve derleme zamanında doğru metodu seçer. Bu karar, program çalışmadan önce sabitlenir.
Çalışma zamanı polimorfizmi (dinamik polimorfizm), program çalışırken çözümlenir. Bu, virtual ve override metotları ile gerçekleşir - nesnenin gerçek türü hangi metodun yürütüleceğini belirler:
Animal pet = new Dog(); // Animal olarak bildirildi, aslında bir Dog
pet.Speak(); // Çalışma zamanında Dog'un Speak() metodunu çağırırDerleyici hangi Speak() metodunun çalışacağını bilmez - bu karar, nesnenin gerçek türüne bağlı olarak çalışma zamanında verilir. Kalıtım tabanlı polimorfizmi esnek ve genişletilebilir sistemler oluşturmak için bu kadar güçlü kılan şey budur.
Görev
KolayHer iki polimorfizm türünü de uygulamalı olarak gösteren bir dönüştürücü sistemi oluşturalım. Metot aşırı yüklemesini (derleme zamanı polimorfizmi), sanal/override metotları kullanan bir kalıtım hiyerarşisiyle (çalışma zamanı polimorfizmi) birlikte kullanan bir sınıf oluşturacaksınız.
Kodunuzu dört dosyaya ayıracaksınız:
Converter.cs:Converternamespace'inde birConversionsınıfı tanımlayın. Bu sınıf, metot aşırı yükleme yoluyla derleme zamanı polimorfizmini gösterir. Aşırı yüklenmiş üçConvertmetodu oluşturun:Convert(int value),"Integer: {value}"döndürürConvert(double value),"Double: {value}"döndürürConvert(string value),"String: {value}"döndürür
Shape.cs:Shapenamespace'inde bir temelConversionsınıfı tanımlayın. Bu sınıf birNameözelliğine (string) ve bu özelliği ayarlayan bir kurucuya sahiptir.virtualdöndürenDescribe()adlı bir"This is a {Name}"metot ekleyin.Circle.cs:Circlenamespace'indeConversionsınıfından kalıtım alan birShapesınıfı tanımlayın. BirRadiusözelliği (double) ekleyin. Kurucu bir yarıçap kabul etmeli ve temel kurucuya"Circle"değerini aktarmalıdır.Describe()metodunu,"This is a Circle with radius {Radius}"döndürecek şekilde geçersiz kılın.Program.cs: Ana dosyanızda her iki polimorfizm türünü de gösterin. Önce birConverteroluşturun ve her üç aşırı yüklenmiş metodu da giriş değerleriyle çağırın. Ardından birCircleoluşturun, bunu birShapedeğişkeninde saklayın ve çalışma zamanı polimorfizmini göstermek içinDescribe()metodunu çağırın.
Dört giriş alacaksınız:
- Bir tamsayı değeri
- Bir double değeri
- Bir string değeri
- Bir dairenin yarıçapı (double)
Çıktıyı şu biçimde yazdırın:
Compile-time Polymorphism:
{Convert(int) result}
{Convert(double) result}
{Convert(string) result}
Runtime Polymorphism:
{Describe() result from Shape variable holding Circle}Örneğin girdiler 42, 3.14, Hello ve 5.5 ise çıktı şu şekilde olmalıdır:
Compile-time Polymorphism:
Integer: 42
Double: 3.14
String: Hello
Runtime Polymorphism:
This is a Circle with radius 5.5Temel farka dikkat edin: derleyici, hangi Convert metodunun çağrılacağına derleme zamanında bağımsız değişken türlerine göre karar verirken Describe() metodu, bir Shape değişkeninde saklanıyor olsa bile gerçek nesne türüne göre çalışma zamanında çözümlenir!
Kendin dene
using System;
using Conversion;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
int intValue = Convert.ToInt32(Console.ReadLine());
double doubleValue = Convert.ToDouble(Console.ReadLine());
string stringValue = Console.ReadLine();
double radius = Convert.ToDouble(Console.ReadLine());
// TODO: Derleme zamanı çok biçimliliğini (Compile-time Polymorphism) göster
// Bir Converter nesnesi oluşturun ve aşırı yüklenmiş (overloaded) üç Convert metodunun tümünü çağırın
Console.WriteLine("Compile-time Polymorphism:");
// intValue, doubleValue ve stringValue ile Convert metodunu çağırın
// TODO: Çalışma zamanı çok biçimliliğini (Runtime Polymorphism) göster
// Bir Circle nesnesi oluşturun ve onu bir Shape değişkeninde saklayın
// Ardından Shape değişkeni üzerinde Describe() metodunu çağırın
Console.WriteLine("Runtime Polymorphism:");
// Circle oluşturun ve Describe() metodunu çağı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