Hangisinin en iyisi olduğu değil, ne zaman kullanılacağı meselesi.
'Normal' vakalarda, miras veya toplamaya ihtiyacımız olup olmadığını anlamak için basit bir soru yeterlidir.
- Yeni sınıf ise olduğu orijinal sınıf olarak az ya da çok. Kalıtım kullanın. Yeni sınıf, artık orijinal sınıfın bir alt sınıfıdır.
- Yeni sınıfın orijinal sınıfa sahip olması gerekir . Toplama kullanın. Yeni sınıf artık üye olarak orijinal sınıfa sahiptir.
Ancak, büyük bir gri alan var. Bu yüzden başka numaralara ihtiyacımız var.
- Kalıtım kullandıysak (veya kullanmayı planlıyoruz) ancak arayüzün yalnızca bir kısmını kullanırsak veya korelasyonu mantıklı tutmak için birçok işlevselliği geçersiz kılmak zorunda kalırız. Sonra kümelenme kullanmak zorunda olduğumuzu gösteren büyük bir kötü kokumuz var.
- Toplama kullandıysanız (veya kullanmayı planlıyorsak), ancak neredeyse tüm işlevleri kopyalamamız gerektiğini öğreniriz. Sonra kalıtım yönünü gösteren bir kokumuz var.
Kısa kesmek için. Arayüzün bir kısmı kullanılmıyorsa veya mantıksız bir durumdan kaçınmak için değiştirilmesi gerekiyorsa toplama kullanmalıyız. Büyük değişiklikler olmadan neredeyse tüm işlevselliklere ihtiyacımız varsa, yalnızca kalıtım kullanmamız gerekir. Şüphe duyduğunuzda Toplama'yı kullanın.
Diğer bir olasılık da, orijinal sınıfın işlevselliğinin bir kısmına ihtiyaç duyan bir sınıfa sahip olmamız durumunda, orijinal sınıfı bir kök sınıfında ve bir alt sınıfta bölmektir. Ve yeni sınıfın kök sınıftan miras almasına izin verin. Ama mantıksız bir ayrılık yaratmak için değil, bununla ilgilenmelisin.
Bir örnek ekleyelim. 'Eat', 'Walk', 'Bark', 'Play' yöntemleriyle bir 'Dog' sınıfımız var.
class Dog
Eat;
Walk;
Bark;
Play;
end;
Şimdi 'Eat', 'Walk', 'Purr' ve 'Play' gerektiren bir 'Cat' sınıfına ihtiyacımız var. Bu yüzden önce onu bir Köpek'ten uzatmaya çalışın.
class Cat is Dog
Purr;
end;
Görünüyor, tamam, ama bekle. Bu kedi Bark yapabilir (Kedi severler bunun için beni öldürecek). Ve havlayan bir kedi evrenin ilkelerini ihlal eder. Bu yüzden Bark yöntemini geçersiz kılmalıyız, böylece hiçbir şey yapmaz.
class Cat is Dog
Purr;
Bark = null;
end;
Tamam, bu işe yarıyor, ama kötü kokuyor. Şimdi bir toplamayı deneyelim:
class Cat
has Dog;
Eat = Dog.Eat;
Walk = Dog.Walk;
Play = Dog.Play;
Purr;
end;
Tamam, bu güzel. Bu kedi artık havlamıyor, sessiz bile değil. Ama yine de dışarı isteyen bir köpeği var. Üç numaralı çözümü deneyelim:
class Pet
Eat;
Walk;
Play;
end;
class Dog is Pet
Bark;
end;
class Cat is Pet
Purr;
end;
Bu çok daha temiz. İç köpek yok. Ve kediler ve köpekler aynı seviyededir. Modeli genişletmek için diğer evcil hayvanları bile tanıtabiliriz. Bir balık ya da yürümeyen bir şey olmadığı sürece. Bu durumda tekrar gözden geçirmemiz gerekiyor. Ama bu başka bir zaman için bir şey.