5 - Kompozisyon ve Polimorfizm
2025
class Motor:
def __init__(self, beygir_gucu):
self.beygir_gucu = beygir_gucu
def calistir(self):
print(f"{self.beygir_gucu} beygirlik motor çalıştı")
class Araba:
def __init__(self, marka, model, motor_gucu):
self.marka = marka
self.model = model
self.motor = Motor(motor_gucu) # Kompozisyon
def sur(self):
print(f"{self.marka} {self.model} hareket ediyor")
self.motor.calistir()
class Computer:
def __init__(self):
self.cpu = CPU() # Kompozisyon
self.ram = RAM() # Kompozisyon
self.storage = Storage() # Kompozisyon
def run(self):
self.storage.read()
self.ram.load()
self.cpu.process()
# Kullanım
bilgisayar = Computer()
bilgisayar.run()
# Çıktı:
# Veri depodan okunuyor
# Veri belleğe yükleniyor
# Veri işleniyor
class Ogrenci:
def __init__(self, ad, numara):
self.ad = ad
self.numara = numara
class Ders:
def __init__(self, ad, kod):
self.ad = ad
self.kod = kod
self.ogrenciler = []
def ogrenci_ekle(self, ogrenci):
self.ogrenciler.append(ogrenci)
class Universite:
def __init__(self, ad):
self.ad = ad
self.dersler = [] # Kompozisyon
def ders_ekle(self, ders):
self.dersler.append(ders)
class Adres:
def __init__(self, sokak, sehir, posta_kodu):
self.sokak = sokak
self.sehir = sehir
self.posta_kodu = posta_kodu
def adres_bilgisi(self):
return f"{self.sokak}, {self.sehir}, {self.posta_kodu}"
class Ogrenci:
def __init__(self, ad, soyad, sokak, sehir, posta_kodu):
self.ad = ad
self.soyad = soyad
self.adres = Adres(sokak, sehir, posta_kodu) # Kompozisyon
def ogrenci_bilgisi(self):
return f"{self.ad} {self.soyad}\nAdres: {self.adres.adres_bilgisi()}"
Tanım: Farklı sınıflardan nesnelerin aynı arayüzü kullanarak farklı davranışlar sergilemesi.
Faydaları:
Python’da: Dinamik tip sistemiyle doğal olarak desteklenir.
class Sekil:
def alan(self):
pass
class Daire(Sekil):
def __init__(self, yaricap):
self.yaricap = yaricap
def alan(self):
return 3.14 * self.yaricap ** 2
class Dikdortgen(Sekil):
def __init__(self, genislik, yukseklik):
self.genislik = genislik
self.yukseklik = yukseklik
def alan(self):
return self.genislik * self.yukseklik
class Hesap:
def __init__(self, bakiye=0):
self.bakiye = bakiye
def para_cek(self, miktar):
if miktar <= self.bakiye:
self.bakiye -= miktar
return f"{miktar} TL çekildi. Yeni bakiye: {self.bakiye}"
return "Yetersiz bakiye"
class VadesizHesap(Hesap):
def para_cek(self, miktar):
limit = self.bakiye + 1000 # Ek limit
if miktar <= limit:
self.bakiye -= miktar
return f"{miktar} TL çekildi. Yeni bakiye: {self.bakiye}"
return "Limit aşımı"
Tanım: “Eğer ördek gibi yürüyor ve vaklıyorsa, o bir ördektir.”
Özellik: Nesnenin türü değil, davranışları önemlidir.
Python’da: Kalıtım olmadan, aynı metot isimleriyle polimorfizm sağlanır.
class AkilliEv:
def __init__(self):
self.cihazlar = [] # Kompozisyon
def cihaz_ekle(self, cihaz):
self.cihazlar.append(cihaz)
def tumunu_ac(self):
for cihaz in self.cihazlar:
print(cihaz.ac()) # Polimorfizm
# Kullanım
ev = AkilliEv()
ev.cihaz_ekle(Televizyon())
ev.cihaz_ekle(MuzikCalar())
ev.tumunu_ac()
# Çıktı:
# TV açıldı
# Müzik çalar açıldı
Kompozisyon: “Has-a” ilişkisiyle nesneleri birleştirir, esneklik sağlar.
Polimorfizm: Farklı nesnelerin aynı arayüzle farklı davranışlar sergilemesini sağlar.
Duck Typing: Nesnelerin davranışlarına odaklanır, kalıtım zorunlu değildir.
Birlikte Kullanım: Daha güçlü ve modüler sistemler tasarlanır.
Soru 1: Kompozisyon - Kitap ve Yazar
Talimatlar:
Beklenen Çıktı Örneği:
Soru 2: Polimorfizm - Taşıtlar
Talimatlar:
Beklenen Çıktı Örneği:
Soru 3: Duck Typing - Yazıcı ve Fotokopi Makinesi
Talimatlar:
Beklenen Çıktı Örneği:
Soru 4: Kompozisyon ve Polimorfizm - Oyun ve Karakterler
Talimatlar:
Beklenen Çıktı Örneği: