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ümlenir. Metot aşırı yüklemesi (method overloading) birincil örnektir - 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 versiyonunu seçer
calc.Add(5.0, 3.0); // Derleyici double versiyonunu 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 iş başında gösteren bir dönüştürücü sistemi oluşturalım. Metot aşırı yüklemesini (derleme zamanı polimorfizmi) ve sanal/geçersiz kılma (virtual/override) metotlarını kullanan bir kalıtım hiyerarşisini (çalışma zamanı polimorfizmi) birlikte kullanan bir sınıf oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Converter.cs:Conversionad alanında (namespace) birConvertersınıfı tanımlayın. Bu sınıf, metot aşırı yüklemesi yoluyla derleme zamanı polimorfizmini gösterir. Üç adet aşırı yüklenmişConvertmetodu oluşturun:Convert(int value)metodu"Integer: {value}"döndürürConvert(double value)metodu"Double: {value}"döndürürConvert(string value)metodu"String: {value}"döndürür
Shape.cs:Conversionad alanında bir temelShapesınıfı tanımlayın. Bu sınıfın birNameözelliği (string) ve bunu ayarlayan bir yapıcısı (constructor) vardır."This is a {Name}"döndürenDescribe()adında birvirtualmetot ekleyin.Circle.cs:Conversionad alanındaShapesınıfından miras alan birCirclesınıfı tanımlayın. BirRadiusözelliği (double) ekleyin. Yapıcı metot bir yarıçap kabul eder ve temel yapıcıya"Circle"değerini gönderir.Describe()metodunu,"This is a Circle with radius {Radius}"döndürecek şekilde geçersiz kılın (override).Program.cs: Ana dosyanızda her iki polimorfizm türünü de gösterin. İlk olarak, birConverteroluşturun ve giriş değerleriyle üç aşırı yüklenmiş metodun tümünü ç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 tam sayı (integer) değeri
- Bir ondalıklı sayı (double) değeri
- Bir dize (string) değeri
- Bir daire yarıçapı (double)
Çıktıyı şu formatta 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, girişler 42, 3.14, Hello ve 5.5 ise çıktı şöyle 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 argüman türlerine göre karar verirken, Describe() metodu bir Shape değişkeninde saklanmasına rağmen çalışma zamanında gerçek nesne türüne göre çözümlenir!
Kopya kağıdı
Polimorfizm "çok biçimlilik" anlamına gelir - aynı kodun bağlama bağlı olarak farklı davranma yeteneğidir.
Derleme zamanı polimorfizmi (statik polimorfizm), program çalışmadan önce derleyici tarafından çözümlenir. Metot aşırı yüklemesi (method overloading) bunun birincil örneğidir:
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 versiyonunu seçer
calc.Add(5.0, 3.0); // Derleyici double versiyonunu seçerDerleyici, argüman türlerini inceler ve derleme zamanında doğru metodu seçer.
Çalışma zamanı polimorfizmi (dinamik polimorfizm), program çalışırken virtual ve override metotları kullanılarak çözümlenir:
Animal pet = new Dog(); // Animal olarak bildirildi, aslında bir Dog
pet.Speak(); // Çalışma zamanında Dog'un Speak() metodunu çağırırBildirilen değişken türü değil, nesnenin gerçek türü çalışma zamanında hangi metodun yürütüleceğini belirler.
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ı