Polymorphism (Çok Biçimlilik): Arayüzler ve Soyut Sınıflar

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

C# Polymorphism: Arayüzler ve Soyut Sınıflar ile Esnek Kodlama​


Polymorphism, bir nesnenin başka bir nesne gibi davranabilme yeteneğidir. Örneğin, elimizde bir "Ödeme" metodu varsa, bu metodun hem "Kredi Kartı" hem "Nakit" hem de "Kripto" için farklı çalışmasını ama dışarıdan bakıldığında sadece "Öde" olarak görünmesini sağlar.



1. Soyut Sınıflar (Abstract Classes)​


Soyut sınıflar, "yarım kalmış" sınıflardır. Kendi başlarına new anahtar kelimesi ile nesne haline getirilemezler. Amaçları, kendisinden türeyecek alt sınıflar için ortak bir şablon ve zorunlu yetenekler belirlemektir.


  • []Abstract Method: Gövdesi olmayan, alt sınıflar tarafından doldurulması zorunlu olan metottur.
    []Kullanım Amacı: "Bu bir X'tir" (is-a) ilişkisi olan durumlarda kullanılır.

C#:
public abstract class Muzisyen
{
public string Ad { get; set; }

// Her müzisyen enstrüman çalar ama yöntemi farklıdır (Zorunlu)
public abstract void EnstrumanCal();

// Ortak metot (Zorunlu değil, her müzisyen aynı yapar)
public void SelamVer() => Console.WriteLine("Merhaba!");

}

public class Gitarist : Muzisyen
{
public override void EnstrumanCal() => Console.WriteLine("Gitar telleri titretiliyor...");
}



2. Arayüzler (Interfaces)​


Arayüzler bir sınıf değildir; bir yetenek sözleşmesidir. Bir sınıfa "Hangi özelliklere sahip olması gerektiğini" söyler ama "Nasıl yapacağını" söylemez. C#'ta bir sınıf sadece bir sınıftan miras alabilirken, sınırsız sayıda arayüzü uygulayabilir.


  • []Kural: I harfi ile başlarlar (Örn: ILogger).
    []Kullanım Amacı: "Bu işi yapabilir" (can-do) ilişkisi olan durumlarda kullanılır.

C#:
public interface IYazdirilabilir
{
void Yazdir(); // Gövdesiz metot
}

public class Belge : IYazdirilabilir
{
public void Yazdir() => Console.WriteLine("Belge yazıcıya gönderildi.");
}

public class Fotograf : IYazdirilabilir
{
public void Yazdir() => Console.WriteLine("Fotoğraf kağıda basılıyor.");
}



3. Polymorphism'in Gücü: Pratik Bir Örnek​


Polymorphism sayesinde, elimizdeki nesnelerin gerçek türünü bilmeden onlara komut verebiliriz.

C#:
List<IYazdirilabilir> basilecekOgeler = new List<IYazdirilabilir>();
basilecekOgeler.Add(new Belge());
basilecekOgeler.Add(new Fotograf());

foreach (var oge in basilecekOgeler)
{
oge.Yazdir(); // Ogenin Belge mi Fotograf mı olduğunu bilmesine gerek yok!
}



Abstract Class mı, Interface mi? Hangisi?​


Hangi yapıyı seçeceğiniz konusunda kararsızsanız bu tablo size rehberlik edecektir:

ÖzellikAbstract ClassInterface
Miras LimitSadece bir tane alınabilir.Sınırsız sayıda uygulanabilir.
Metot GövdesiHem dolu hem boş metot olabilir.Sadece boş metot (imza) olur.*
Field (Değişken)Değişken barındırabilir.Sadece Property barındırabilir.
İlişki TürüSıkı hiyerarşi (is-a).Gevşek yetenek bağı (can-do).
*Not: C# 8.0 ile birlikte Interface'ler içinde "Default Implementation" (varsayılan gövde) desteği gelmiştir ancak temel mantık hâlâ sözleşme üzerinedir.



Sonuç​


Polymorphism, projenizin genişleyebilir olmasını sağlar. Bugün 2 ödeme yöntemi olan sisteminize yarın 3. bir yöntemi eklerken mevcut kodunuzu bozmanıza gerek kalmaz; tek yapmanız gereken arayüzü uygulayan yeni bir sınıf yazmaktır. İşte bu esneklik, "Clean Code" (Temiz Kod) yazmanın temelidir.
 
Geri
Üst