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ü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ç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 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: Converter namespace'inde bir Conversion sınıfı tanımlayın. Bu sınıf, metot aşırı yükleme yoluyla derleme zamanı polimorfizmini gösterir. Aşırı yüklenmiş üç Convert metodu oluşturun:
    • Convert(int value), "Integer: {value}" döndürür
    • Convert(double value), "Double: {value}" döndürür
    • Convert(string value), "String: {value}" döndürür
  • Shape.cs: Shape namespace'inde bir temel Conversion sınıfı tanımlayın. Bu sınıf bir Name özelliğine (string) ve bu özelliği ayarlayan bir kurucuya sahiptir. virtual döndüren Describe() adlı bir "This is a {Name}" metot ekleyin.
  • Circle.cs: Circle namespace'inde Conversion sınıfından kalıtım alan bir Shape sınıfı tanımlayın. Bir Radius ö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 bir Converter oluşturun ve her üç aşırı yüklenmiş metodu da giriş değerleriyle ç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 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.5

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

Kendi başına pratik yap: Online C# derleyicisi