Geleneksel sınıf hiyerarşilerinin iyi bilinen bir eksikliği, gerçek dünyayı modelleme söz konusu olduğunda onların kötü olmalarıdır. Örnek olarak, hayvan türlerini sınıflarla temsil etmeye çalışmak. Bunu yaparken aslında birkaç problem var, ama bir çözüm görmedim, bir alt sınıfın uçamayan bir penguen gibi bir süper sınıfta tanımlanmış bir davranışı veya mülkü "kaybetmesi" dir (orada muhtemelen daha iyi örneklerdir, ama aklıma ilk gelen budur).
Bir yandan, her özellik ve davranış için, mevcut olup olmadığını belirten bir bayrak tanımlamak ve bu davranışa veya özelliğe erişmeden önce her zaman kontrol etmek istemezsiniz. Kuşların Kuşlar sınıfında basit ve açık bir şekilde uçabileceklerini söylemek istersiniz. Fakat daha sonra "istisnalar" her yerde bazı korkunç hackler kullanmak zorunda kalmadan tanımlanabilseydi daha iyi olurdu. Bu genellikle bir süredir bir sistem üretken olur. Birdenbire, orijinal tasarıma hiç uymayan bir "istisna" buluyorsunuz ve kodunuzun büyük bir bölümünü buna uyacak şekilde değiştirmek istemiyorsunuz.
Öyleyse, "süper sınıf" ve onu kullanan tüm kodlarda büyük değişiklikler gerektirmeden, bu sorunu temiz bir şekilde ele alabilen bazı dil veya tasarım kalıpları var mı? Bir çözüm yalnızca belirli bir durumu ele alsa bile, birkaç çözüm birlikte tam bir strateji oluşturabilir.
Daha fazla düşündükten sonra, Liskov Değişim İlkesini unuttuğumu fark ettim. Bu yüzden yapamazsın. Tüm ana "özellik grupları" için "özellikleri / arayüzleri" tanımladığınızı varsayarsak, Uçan özelliği, Kuşlar ve bazı özel sincaplar ve balıkların uygulayabileceği gibi, hiyerarşinin farklı dallarında özellikleri serbestçe uygulayabilirsiniz.
Bu yüzden sorum, "Bir özelliği nasıl uygulayabilirim?" Anlamına gelebilir. Süper sınıfınız bir Java Seri hale getirilebilirse, örneğin bir "Soket" içeriyorsanız, durumunuzu seri hale getirme imkanı olmasa bile, siz de bir tane olmalısınız.
Bunu yapmanın bir yolu, her zaman tüm özelliklerinizi baştan başlayarak çiftler halinde tanımlamaktır: Flying and NotFlying (eğer kontrol edilmezse, desteklenmeyenOperationException'ı fırlatır). Not-trait özelliği, herhangi bir yeni arayüz tanımlamaz ve sadece kontrol edilebilir. Özellikle en baştan kullanıldığında "ucuz" bir çözüm gibi geliyor.
" it would be nice if one could define "exceptions" afterward, without having to use some horrible hacks everywhere"
hack davranışını kontrol eden bir fabrika metodu düşünüyor musunuz?
NotSupportedException
dan Penguin.fly()
.
class Penguin < Bird; undef fly; end;
. Yapmanız gereken başka bir soru.
function save_yourself_from_crashing_airplane(Bird b) { f.fly() }
daha da karmaşıklaşacağı anlamına gelir . (Peter