Menu
Coddy logo textTech

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çer

Derleyici, 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ır

Derleyici 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.

challenge icon

Görev

Kolay

Her 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: Conversion ad alanında (namespace) bir Converter sı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ş Convert metodu oluşturun:
    • Convert(int value) metodu "Integer: {value}" döndürür
    • Convert(double value) metodu "Double: {value}" döndürür
    • Convert(string value) metodu "String: {value}" döndürür
  • Shape.cs: Conversion ad alanında bir temel Shape sınıfı tanımlayın. Bu sınıfın bir Name özelliği (string) ve bunu ayarlayan bir yapıcısı (constructor) vardır. "This is a {Name}" döndüren Describe() adında bir virtual metot ekleyin.
  • Circle.cs: Conversion ad alanında Shape sınıfından miras alan bir Circle sınıfı tanımlayın. Bir Radius ö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, bir Converter oluşturun ve giriş değerleriyle üç aşırı yüklenmiş metodun tümünü çağırın. Ardından bir Circle oluşturun, bunu bir Shape değişkeninde saklayın ve çalışma zamanı polimorfizmini göstermek için Describe() 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.5

Temel 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çer

Derleyici, 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ır

Bildirilen 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
    }
}
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