Ana içeriğe geç

Çok biçimlilik

İngilizcesi
Polymorphism
Türkçe karşılığı
polimorfizm, çok şekillilik
Okunuşu
polimorfizım

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/polymorphism

Kısaca

Çok biçimlilik, kodun farklı türlerdeki değerlerle ortak bir arayüz üzerinden çalışabilmesidir; her tür kendi davranışını sağlar.

Programlamada çok biçimlilik (polymorphism) nedir?

Yunancadaki 'birçok biçim' anlamından gelen çok biçimlilik, aynı kod parçasının farklı türlerdeki nesnelerle çalışabilmesi demektir. Bir şeklin daire mi kare mi olduğunu bilmeden onun üzerinde area() gibi bir metot çağırırsınız ve her nesne kendi doğru yöntemiyle yanıt verir. Bu, genel kodu bir kez yazıp yeni türleri sonradan onu değiştirmeden eklemenizi sağlar.

Nesne yönelimli programlamada en yaygın biçimi alt tür çok biçimliliğidir (subtype polymorphism): ortak bir ebeveyn sınıfı ya da interface'i paylaşan sınıfların her biri aynı metodu geçersiz kılar ve çalışma zamanında dil, nesnenin gerçek türüne göre doğru sürümü seçer; buna dinamik gönderim (dynamic dispatch) denir. Bir sınıfın aynı ada ama farklı parametrelere sahip birkaç metodu olduğu metot aşırı yüklemesi (overloading) ise derleme zamanında çözümlenen başka bir biçimdir. Generics, tek bir fonksiyonun ya da sınıfın birçok türle çalıştığı parametrik çok biçimlilik denen üçüncü biçimdir.

Evrensel kumanda iyi bir benzetmedir: güç düğmesine basmak, her cihaz kendi yöntemiyle açılsa da televizyonda, ses çubuğunda ve akış kutusunda çalışır. Aynı şekilde bir ödeme sistemi kart, banka havalesi ya da cüzdan nesnelerinin hepsinde pay() çağırabilir ve bir çizim uygulaması bir şekiller listesi üzerinde dönüp her birinde draw() çağırabilir.

Çok biçimlilik sıklıkla kalıtımla karıştırılır. Kalıtım sınıflar arasında kod paylaşmanın bir yoludur; çok biçimlilik ise farklı türleri ortak bir arayüz üzerinden kullanabilme yeteneğidir ve bu, interface'lerden ya da Python ve JavaScript gibi dinamik dillerdeki, doğru metoda sahip her nesnenin çalıştığı duck typing'den de gelebilir. Bir nesnenin türünü denetleyip ne yapacağına karar veren uzun bir if ya da switch deyimi, çok biçimliliğin yardımcı olacağının bir işaretidir.

Önemli noktalar

  • Çok biçimlilik, tek arayüz ve birçok uygulama demektir.
  • Alt tür çok biçimliliği, nesnenin gerçek türüne göre doğru geçersiz kılınmış metodu çalışma zamanında seçer.
  • Metot aşırı yüklemesi ve generics, çok biçimliliğin diğer biçimleridir.
  • Duck typing, dinamik dillere ortak bir ebeveyn sınıf olmadan çok biçimlilik sağlar.
  • Tür denetleyen uzun if ya da switch zincirlerinin yerine tek bir metot çağrısı koyar.

Örnek

JavaScript'te tek döngü, birçok şekiljavascript
class Shape {
  area() { return 0; }
}
class Circle extends Shape {
  constructor(r) { super(); this.r = r; }
  area() { return Math.PI * this.r ** 2; }
}
class Square extends Shape {
  constructor(side) { super(); this.side = side; }
  area() { return this.side ** 2; }
}

// One loop works for every kind of shape, including ones added later
const shapes = [new Circle(1), new Square(2)];
for (const s of shapes) console.log(s.area()); // 3.14159..., then 4

Sık sorulan sorular

Çok biçimlilik ile kalıtım arasındaki fark nedir?

Kalıtım bir sınıfın başka bir sınıfın kodunu yeniden kullanıp genişletmesini sağlar; çok biçimlilik ise kodun farklı türlerdeki nesnelere ortak bir arayüz üzerinden davranmasına izin verir. Kalıtım çok biçimlilik elde etmenin yaygın yollarından biridir, ancak interface'ler ve duck typing hiç kod paylaşmadan aynısını sağlar.

Aşırı yükleme (overloading) ile geçersiz kılma (overriding) arasındaki fark nedir?

Aşırı yükleme, aynı sınıftaki birkaç metodun aynı adı taşıyıp farklı parametreler alması demektir ve derleyici birini derleme zamanında seçer. Geçersiz kılma ise bir alt sınıfın aynı imzaya sahip ebeveyn metodunun yerini almasıdır ve doğru sürüm çalışma zamanında seçilir.

Çok biçimlilik türleri nelerdir?

Ana türler alt tür çok biçimliliği (ortak bir ebeveynden ya da interface'ten gelen metotları geçersiz kılma), ad hoc çok biçimlilik (metot ve operatör aşırı yüklemesi) ve parametrik çok biçimliliktir (generics). Dinamik diller ayrıca büyük ölçüde duck typing'e dayanır.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar