Bir arabirim (kalıtım değil) veya bir tür özellik mekaniği (belki de kaynak tanımlama çerçevesi gibi çalışan bir şey) kullanmalısınız.
Bu yüzden ya
interface Colored {
Color getColor();
}
class ColoredBook extends Book implements Colored {
...
}
veya
class PropertiesHolder {
<T> extends Property<?>> Optional<T> getProperty( Class<T> propertyClass ) { ... }
<V, T extends Property<V>> Optional<V> getPropertyValue( Class<T> propertyClass ) { ... }
}
interface Property<T> {
String getName();
T getValue();
}
class ColorProperty implements Property<Color> {
public Color getValue() { ... }
public String getName() { return "color"; }
}
class Book extends PropertiesHolder {
}
Açıklama (değiştir):
Varlık sınıfına yalnızca isteğe bağlı alanlar ekleme
Özellikle İsteğe bağlı sarıcı ile (değiştir: 4castle'ın cevabına bakınız ) Bence bu (orijinal varlığa alan eklemek) küçük ölçekli yeni özellikler eklemek için uygun bir yoldur. Bu yaklaşımla ilgili en büyük sorun, düşük bağlantıya karşı çalışabilmesidir.
Kitap sınıfınızın alan modeliniz için özel bir projede tanımlandığını düşünün. Şimdi özel bir görev yapmak için etki alanı modelini kullanan başka bir proje ekliyorsunuz. Bu görev, kitap sınıfında ek bir özellik gerektirir. Ya kalıtımla karşılaşırsınız (aşağıya bakın) ya da yeni görevi mümkün kılmak için ortak etki alanı modelini değiştirmeniz gerekir. İkinci durumda, kitap sınıfının kendisi bu projelere bağlıyken, hepsi kitap sınıfına eklenen kendi özelliklerine bağlı olan bir grup projeyle sonuçlanabilir, çünkü kitap sınıfını ek projeler.
Ek özellikler sağlamanın bir yolu söz konusu olduğunda miras neden sorunludur?
Örnek sınıf "Kitap" ı gördüğümde, genellikle birçok isteğe bağlı alan ve alt tipe sahip bir etki alanı nesnesini düşünüyorum. CD içeren kitaplar için bir özellik eklemek istediğinizi düşünün. Artık dört çeşit kitap var: kitaplar, renkli kitaplar, CD'li kitaplar, renkli kitaplar ve CD. Bu durumu Java'da kalıtımla tanımlayamazsınız.
Arabirimlerle bu sorunu atlatırsınız. Arabirimlerle belirli bir kitap sınıfının özelliklerini kolayca oluşturabilirsiniz. Yetki devri ve kompozisyon, tam olarak istediğiniz sınıfı almanızı kolaylaştıracaktır. Kalıtım ile genellikle sınıfta sadece orada olan bazı isteğe bağlı özellikler ile sonuçlanırsınız çünkü bir kardeş sınıfın onlara ihtiyacı vardır.
Mirasın neden genellikle sorunlu bir fikir olduğunu daha fazla okumak:
Kalıtım neden OOP taraftarları tarafından genellikle kötü bir şey olarak görülüyor?
JavaWorld: Neden uzanıyor kötülük
Bir dizi özellik oluşturmak için bir dizi arabirimin uygulanmasındaki sorun
Uzatma için arayüzler kullandığınızda, sadece küçük bir setiniz olduğu sürece her şey yolundadır. Özellikle nesne modeliniz, örneğin şirketinizdeki diğer geliştiriciler tarafından kullanılıp genişletildiğinde, arayüzlerin miktarı artacaktır. Ve sonunda, iş arkadaşlarınızın tamamen ilgisiz bir kullanım durumu için X müşterileri için projelerinde zaten kullandıkları bir yöntemi ekleyen yeni bir resmi "özellik arayüzü" oluşturursunuz - Ugh.
edit: Başka bir önemli yönü gnasher729 tarafından belirtilmiştir . Genellikle varolan bir nesneye dinamik olarak isteğe bağlı özellikler eklemek istersiniz. Kalıtım veya arabirimlerle, tüm nesneyi isteğe bağlı olmaktan başka bir sınıfla yeniden oluşturmanız gerekir.
Nesne modelinizin uzantılarını böyle bir ölçüde beklediğinizde, dinamik uzantı olasılığını açıkça modelleyerek daha iyi olursunuz . Her bir "uzantı" (bu durumda özelliği) kendi sınıfına sahip yukarıdaki gibi bir şey öneriyorum. Sınıf, uzantı için ad alanı ve tanımlayıcı olarak çalışır. Paket adlandırma kurallarını buna göre ayarladığınızda, orijinal varlık sınıfındaki yöntemler için ad alanını kirletmeden sonsuz miktarda uzantıya izin verir.
Oyun geliştirmede, genellikle birçok varyasyonda davranış ve veri oluşturmak istediğiniz durumlarla karşılaşırsınız. Bu nedenle mimari model varlık-bileşen-sistemi oyun geliştirme çevrelerinde oldukça popüler hale geldi. Bu, nesne modelinize birçok uzantı beklediğinizde, bakmak isteyebileceğiniz ilginç bir yaklaşımdır.