Ç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.
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
ifya daswitchzincirlerinin yerine tek bir metot çağrısı koyar.
Örnek
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 4Sı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
- OOPProgramlamanın Temelleri, s. 41OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
- KalıtımProgramlamanın Temelleri, s. 31Kalıtım, yeni bir sınıfın mevcut bir sınıfın alanlarını ve metotlarını yeniden kullanmasını, genişletmesini ve geçersiz kılmasını sağlayan OOP özelliğidir.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- SınıfProgramlamanın Temelleri, s. 49Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- GenericsProgramlamanın Temelleri, s. 23Generics, tam tür güvenliğini korurken birçok veri türüyle çalışan fonksiyonlar, sınıflar ve türler yazmanıza olanak tanıyan bir dil özelliğidir.
- KapsüllemeProgramlamanın Temelleri, s. 33Kapsülleme, verileri onları kullanan metotlarla paketleyip iç ayrıntıları gizlemektir; dışarıdaki kod yalnızca herkese açık bir arayüz üzerinden çalışır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin