C# Dersleri 76 - Polymorphism (Çok Biçimlilik)


C# Polymorphism (Çok Biçimlilik)

Polymorphism (Çok Biçimlilik), Nesne Yönelimli Programlama'nın (OOP) temel prensiplerinden biridir. Aynı metot adıyla farklı davranışlar sergileyen sınıflar oluşturmaya olanak tanır. Polimorfizm sayesinde, bir nesne farklı formlarda kullanılabilir ve kodun esnekliği artar.

Polymorphism Nedir?

  • Üst sınıf referansı kullanılarak alt sınıf nesneleri yönetilebilir.
  • Alt sınıflar, üst sınıftaki metotları ezerek kendi davranışlarını tanımlayabilir.
  • Metotların aynı isimle ancak farklı işlevlerle çalışmasını sağlar.

Polymorphism Türleri

  1. Method Overriding (Metot Ezme) - Run-time Polymorphism
  2. Method Overloading (Metot Aşırı Yükleme) - Compile-time Polymorphism

1. Method Overriding ile Polymorphism

Alt sınıflar, üst sınıftaki metotları ezerek kendi davranışlarını belirleyebilir.

using System;

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Hayvan bir ses çıkarıyor.");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Köpek havlıyor: Hav hav!");
    }
}

class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Kedi miyavlıyor: Miyav miyav!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal myAnimal1 = new Dog();
        Animal myAnimal2 = new Cat();

        myAnimal1.MakeSound(); // Köpek havlıyor: Hav hav!
        myAnimal2.MakeSound(); // Kedi miyavlıyor: Miyav miyav!
    }
}

Programın Çıktısı

Köpek havlıyor: Hav hav!
Kedi miyavlıyor: Miyav miyav!

Base Anahtar Kelimesi ile Üst Sınıf Metodunu Çağırma

Alt sınıfın üst sınıfın metodunu çalıştırmasını sağlamak için base anahtar kelimesi kullanılabilir.

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Hayvan bir ses çıkarıyor.");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        base.MakeSound();
        Console.WriteLine("Köpek ayrıca havlıyor: Hav hav!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog myDog = new Dog();
        myDog.MakeSound();
    }
}

Programın Çıktısı

Hayvan bir ses çıkarıyor.
Köpek ayrıca havlıyor: Hav hav!

2. Method Overloading (Metot Aşırı Yükleme) ile Polymorphism

Bir sınıf içinde aynı isimde ancak farklı parametreler alan metotlar tanımlanabilir. Buna method overloading denir ve derleme zamanında (compile-time) belirlenir.

class MathOperations
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public double Add(double a, double b)
    {
        return a + b;
    }

    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
}

class Program
{
    static void Main(string[] args)
    {
        MathOperations math = new MathOperations();
        
        Console.WriteLine(math.Add(5, 10)); // 15
        Console.WriteLine(math.Add(5.5, 2.2)); // 7.7
        Console.WriteLine(math.Add(1, 2, 3)); // 6
    }
}

Programın Çıktısı

15
7.7
6

Abstract Sınıflarla Polymorphism

Abstract sınıflar, polimorfizmi zorunlu hale getirir. Alt sınıflar, üst sınıftaki metodu mutlaka geçersiz kılmalıdır.

abstract class Animal
{
    public abstract void MakeSound(); // Abstract metot
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Köpek havlıyor: Hav hav!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal myDog = new Dog();
        myDog.MakeSound();
    }
}

Programın Çıktısı

Köpek havlıyor: Hav hav!

Interface ile Polymorphism

Interface kullanarak farklı sınıfların aynı metodu kendi ihtiyaçlarına göre uygulamasını sağlayabiliriz.

interface IShape
{
    void Draw();
}

class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Daire çiziliyor.");
    }
}

class Square : IShape
{
    public void Draw()
    {
        Console.WriteLine("Kare çiziliyor.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IShape shape1 = new Circle();
        IShape shape2 = new Square();

        shape1.Draw(); // Daire çiziliyor.
        shape2.Draw(); // Kare çiziliyor.
    }
}

Sonuç

Polymorphism (çok biçimlilik), OOP’nin temel prensiplerinden biridir. Method Overriding ve Method Overloading ile uygulanabilir. Polimorfizm sayesinde kod daha esnek, okunabilir ve genişletilebilir hale gelir. Farklı nesnelerin aynı metotları farklı şekillerde kullanabilmesi, yazılım geliştirme sürecinde büyük avantaj sağlar.