Kompozisyon vs Kalıtım
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 47 / 87.
Kalıtım, bir "is-a" ilişkisi oluşturur: bir Dog bir Animal'dır. Peki bir sınıf, olmadığı bir şeyin işlevselliğine ihtiyaç duyarsa ne olur? İşte burada composition devreye girer ve bunun yerine bir "has-a" ilişkisi kurar.
Kompozisyon ile bir sınıf, diğer sınıfları genişletmek yerine alanlar olarak bu sınıfların örneklerini içerir:
// Kalıtım yaklaşımı: Car bir Engine'dir (mantıklı değil)
class Car extends Engine { }
// Kompozisyon yaklaşımı: Car bir Engine'e sahiptir (mantıklı)
class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
engine.ignite();
}
}Composition çeşitli avantajlar sunar. Çalışma zamanında, örneğin motorları değiştirerek oluşturulan nesneyi değiştirebilirsiniz.
Ayrıca birden çok sınıftaki davranışları da birleştirebilirsin; kalıtım Java’da buna izin vermez. Oluşturulan sınıf yalnızca seçtiği yöntemleri dışa sunarak daha iyi kapsülleme sağlar.
Pratik bir kılavuz: Gerçek bir "is-a" ilişkisi olduğunda ve alt sınıf gerçekten üst sınıfın özelleştirilmiş bir sürümünü temsil ettiğinde kalıtımı kullanın.
Başka bir tür olmadan başka bir sınıfın işlevselliğini kullanmanız gerektiğinde bileşimi kullanın. Birçok deneyimli geliştirici şu ilkeyi benimser: "kalıtım yerine bileşimi tercih edin"; çünkü bu, daha esnek ve bakımı daha kolay kodlar sağlar.
Görev
Kolay"has-a" ilişkisini göstermek için composition kullanarak bir bilgisayar sistemi oluşturalım. Bir Computer sınıfının bileşenlerinden kalıtım alması (ki bu mantıklı olmazdı) yerine, bilgisayarınız çalışmak için ihtiyaç duyduğu parçaları içerecek.
Kodunuzu üç dosyaya ayıracaksınız:
Processor.java: Bir CPU'yu temsil eden bir sınıf oluşturun. Bir Processor'ın iki private alanı vardır:brand(String) vespeedGHz(double). Her iki alanı başlatmak için bir constructor ve her biri için getter metotları ekleyin. Bir String döndürenprocess()metodu ekleyin:[brand] processing at [speedGHz] GHzMemory.java: RAM'i temsil eden bir sınıf oluşturun. Bir Memory'nin iki private alanı vardır:type(String, "DDR4" veya "DDR5" gibi) vesizeGB(int). Bir constructor, getter'lar ve şunu döndüren birload()metodu ekleyin:Loading [sizeGB]GB [type] memoryComputer.java: Composition'ın gücünü gösterdiği yer burası! Computer sınıfınız private alanlar olarak bir Processor'a ve bir Memory'ye sahip olmalı. Bunları extend etmez; onları içerir. Her iki bileşeni kabul eden bir constructor ekleyin. Bileşenlerini kullanarak bilgisayarın başlatılmasını gösteren çok satırlı bir String döndüren birboot()metodu ekleyin:Ayrıca şunu döndüren birBooting computer... [processor.process() result] [memory.load() result] System ready!getSpecs()metodu ekleyin:Specs: [processor brand] CPU, [memory sizeGB]GB [memory type]Main.java: Composition ile oluşturduğunuz sisteminizi hayata geçirin! Dört girdi alacaksınız: işlemci markası (String), işlemci hızı (double), bellek türü (String) ve bellek boyutu (int).Bu değerlerle bir Processor ve bir Memory oluşturun, ardından bunları bir Computer içinde birleştirin.
boot()çağrısının sonucunu yazdırın, ardındangetSpecs()çağrısının sonucunu yazdırın.
Dört girdiyi şu sırayla alacaksınız: işlemci markası, işlemci hızı (GHz), bellek türü ve bellek boyutu (GB).
Computer'ın kendisi olmaya çalışmak yerine işi bileşenlerine devrettiğine dikkat edin. Composition'ın gücü budur! Computer, kendisine verdiğiniz herhangi bir Processor'ı veya Memory'yi kullanabilir; bu da tasarımı esnek ve gerçekçi kılar.
Kendin dene
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String processorBrand = scanner.nextLine();
double processorSpeed = Double.parseDouble(scanner.nextLine());
String memoryType = scanner.nextLine();
int memorySize = Integer.parseInt(scanner.nextLine());
// TODO: Marka ve hız ile bir Processor oluştur
// TODO: Tür ve boyut ile bir Memory oluştur
// TODO: Processor ve Memory'yi birleştirerek bir Computer oluştur
// TODO: boot() sonucunu yazdır
// TODO: getSpecs() sonucunu yazdır
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi