# Bileşim vs Kalıtım

Adres: https://softwaredictionary.org/tr/karsilastirma/composition-vs-inheritance
Son güncelleme: 2026-10-06

Kısaca: Bileşim, kodu başka nesneleri tutup işi onlara devrederek yeniden kullanır (has-a); kalıtım ise bir üst sınıfı genişleterek yeniden kullanır (is-a).

## Bileşim (composition) ile kalıtım (inheritance) arasındaki fark nedir?

Bileşim ve kalıtım, nesne yönelimli programlamada kodu yeniden kullanmanın iki ana yoludur. Bileşim bir sınıfı, alanlarında tuttuğu ve işi devrettiği başka nesnelerden kurar ve “sahiptir” (has-a) ilişkisini modeller: bir `Car` bir `Engine`'e sahiptir. Kalıtım ise var olan bir sınıftan yeni bir sınıf oluşturur; yeni sınıf ebeveynin alanlarını ve metotlarını alır, onları geçersiz kılabilir ve “-dir” (is-a) ilişkisini modeller: bir `Dog` bir `Animal`'dır.

Asıl fark bağımlılığın sıkılığındadır (coupling). Bir alt sınıf ebeveyninin iç yapısına bağlıdır; bu yüzden ebeveyndeki bir değişiklik bütün alt sınıfları bozabilir ve hiyerarşi kod yazılırken sabitlenir. Özellikler birleştikçe alt sınıflar `ElectricCar`, `HybridCar` ve `SelfDrivingElectricCar` diye çoğalır. Bileşimde ise parçalar genellikle interface'lerin arkasında durur; böylece çalışma zamanında seçilebilir, değiştirilebilir ya da testlerde sahteleriyle yer değiştirebilir. Bedeli biraz daha fazla koddur, çünkü işi devreden her metodun yazılması gerekir.

“Sınıf kalıtımı yerine nesne bileşimini tercih edin” ilkesi, Dörtlü Çete'nin (Gang of Four) 1994 tarihli Design Patterns kitabından gelir; strategy, decorator ve dependency injection gibi desenler de bu ilkenin üzerine kuruludur. Bu bir yasak değil, bir tercihtir: kalıtım, `Error` sınıfını genişleten özel bir hata türü gibi gerçek “-dir” ilişkileri için doğru araç olmayı sürdürür ve gerçek tasarımların çoğu ikisini birlikte kullanır: küçük bir temel sınıftan kalıtım alır ya da bir interface uygular, geri kalanını bileşimle kurar. Bazı diller tasarımları gereği bileşime yaslanır: Go'da sınıf kalıtımı yoktur, onun yerine struct'lar iç içe gömülür; Kotlin ise `by` ile bütün bir interface'i bir alana devreder.

Sık yapılan bir yanlış, çok biçimlilik (polymorphism) için kalıtımın gerekli olduğu düşüncesidir. Interface'ler, farklı nesnelere aynı şekilde davranma imkânını kod paylaşmadan da sağlar. Bir başkası, kalıtımın işe yarar bir metodu yeniden kullanmanın iyi bir yolu olduğu düşüncesidir; bir sınıfı yalnızca kodu için genişletmek, bileşimin kaçındığı sıkı bağlılığı yaratır. Basit test tek bir sorudur: bu bir X çeşidi mi, yoksa bir X'e sahip mi ya da bir X kullanıyor mu?

| Özellik | Bileşim | Kalıtım |
| --- | --- | --- |
| İlişki | Sahiptir (has-a): bir arabanın motoru vardır | -dir (is-a): bir köpek bir hayvandır |
| Kodun yeniden kullanımı | Alanlarda tutulan nesnelere çağrıları devrederek | Bir üst sınıfın alanlarını ve metotlarını miras alarak |
| Bağımlılık | Gevşek: yalnızca parçaların interface'lerine bağlıdır | Sıkı: alt sınıf ebeveyninin iç yapısına bağlıdır |
| Ne zaman sabitlendiği | Parçalar çalışma zamanında seçilebilir ya da testlerde değiştirilebilir | Sınıf yazıldığında sabitlenir |
| Özellikleri birleştirmek | Bir motor ve bir sürücü gibi parçalar serbestçe karıştırılır | Her birleşim kendi alt sınıfını gerektirebilir |
| Kod miktarı | Daha fazla: işi devreden her metot tek tek yazılır | Daha az: miras alınan metotlar hazır gelir |
| Çok biçimlilik | Ortak interface'ler üzerinden | Ebeveynin metotlarını geçersiz kılarak |
| Dil desteği | Her dil; Go ve Kotlin yerleşik kolaylıklar ekler | Çoğu OOP dili; Go'da sınıf kalıtımı yoktur |

## Bileşim şu durumlarda doğru seçim

- Bir nesne, bir araba ve motoru gibi, başka bir nesneye sahip ya da onu kullanıyor.
- Davranışın çalışma zamanında değiştirilebilmesi ya da testlerde sahtesiyle değiştirilmesi gerekiyor.
- Özellikler, alt sınıfları çoğaltacak pek çok şekilde birleşiyor.
- Kontrol etmediğiniz bir sınıfı, iç yapısına bağlanmadan yeniden kullanmak istiyorsunuz.

## Kalıtım şu durumlarda doğru seçim

- Bir tür gerçekten başka bir türün bir çeşidi ve ebeveynin beklendiği her yerde kullanılabilir.
- Bir framework, `Error` ya da bir arayüz bileşeni sınıfı gibi kendi temel sınıfını genişletmenizi bekliyor.
- Hiyerarşi sığ ve kararlı; alt sınıflar ebeveynin kodunun çoğunu paylaşıyor.

## Sık sorulan sorular

**“Kalıtım yerine bileşim” ne anlama gelir?**

Bir tasarım kılavuzudur: bir davranışı yeniden kullanmak için, o davranışa sahip bir sınıfı genişletmek yerine onu sağlayan bir nesneyi tutmayı tercih edin. Kalıtım yasak değildir; gerçek “-dir” ilişkileri için saklanır.

**Kalıtım kötü mü?**

Hayır. Bir tür gerçekten başka bir türün bir çeşidiyse ve hiyerarşi sığ kalıyorsa doğru araçtır. Sorunlar derin ağaçlardan ve yalnızca kodu yeniden kullanmak için kalıtım almaktan çıkar.

**Go kalıtım olmadan nasıl çalışır?**

Go'da sınıf yoktur. Bir struct'ı başka bir struct'ın içine gömer; bu, gömülen türün metotlarını dıştaki türde kullanılabilir kılar. Çok biçimlilik için de interface'leri kullanır; yani yeniden kullanım bileşim yoluyla olur.

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
