आपको या तो एक इंटरफ़ेस (इनहेरिटेंस नहीं) या किसी प्रकार की संपत्ति मैकेनिक का उपयोग करना चाहिए (शायद कुछ ऐसा भी हो जो संसाधन विवरण ढांचे की तरह काम करता है)।
तो या तो
interface Colored {
Color getColor();
}
class ColoredBook extends Book implements Colored {
...
}
या
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 {
}
स्पष्टीकरण (संपादित करें):
बस इकाई वर्ग में वैकल्पिक क्षेत्रों को जोड़ना
विशेष रूप से वैकल्पिक आवरण के साथ (संपादित करें: देखें 4cast का जवाब) मुझे लगता है कि यह (मूल इकाई में फ़ील्ड को जोड़ना) एक छोटे पैमाने में नई संपत्तियों को जोड़ने का एक व्यवहार्य तरीका है। इस दृष्टिकोण के साथ सबसे बड़ी समस्या यह है कि यह कम युग्मन के खिलाफ काम कर सकता है।
कल्पना करें कि आपकी पुस्तक कक्षा आपके डोमेन मॉडल के लिए एक समर्पित परियोजना में परिभाषित है। अब आप एक और प्रोजेक्ट जोड़ते हैं जो एक विशेष कार्य करने के लिए डोमेन मॉडल का उपयोग करता है। इस कार्य के लिए पुस्तक वर्ग में एक अतिरिक्त संपत्ति की आवश्यकता होती है। या तो आप विरासत के साथ समाप्त होते हैं (नीचे देखें) या आपको नए कार्य को संभव बनाने के लिए सामान्य डोमेन मॉडल को बदलना होगा। बाद के मामले में आप परियोजनाओं के एक समूह के साथ समाप्त हो सकते हैं जो सभी पुस्तक वर्ग में जोड़े गए अपने गुणों पर निर्भर करते हैं जबकि पुस्तक वर्ग एक तरह से इन परियोजनाओं पर निर्भर करता है, क्योंकि आप पुस्तक वर्ग को समझे बिना नहीं कर सकते हैं अतिरिक्त परियोजनाएं।
जब अतिरिक्त गुण प्रदान करने का तरीका आता है तो वंशानुक्रम की समस्या क्यों होती है?
जब मैं आपका उदाहरण वर्ग "बुक" देखता हूं, तो मैं एक ऐसे डोमेन ऑब्जेक्ट के बारे में सोचता हूं जो अक्सर कई वैकल्पिक फ़ील्ड और उपप्रकार समाप्त करता है। बस कल्पना करें कि आप उन पुस्तकों के लिए एक संपत्ति जोड़ना चाहते हैं जिनमें एक सीडी शामिल है। अब चार तरह की किताबें हैं: किताबें, रंग वाली किताबें, सीडी वाली किताबें, रंग और सीडी वाली किताबें । आप जावा में इनहेरिटेंस के साथ इस स्थिति का वर्णन नहीं कर सकते।
इंटरफेस के साथ आप इस मुद्दे को दरकिनार करते हैं। आप आसानी से इंटरफेस के साथ एक विशिष्ट पुस्तक वर्ग के गुणों की रचना कर सकते हैं। प्रतिनिधिमंडल और रचना से आप जिस कक्षा को चाहते हैं, ठीक उसी तरह से प्राप्त करना आसान हो जाएगा। वंशानुक्रम के साथ आप आमतौर पर कक्षा में कुछ वैकल्पिक गुणों के साथ समाप्त होते हैं जो केवल इसलिए होते हैं क्योंकि एक सहोदर वर्ग को उनकी आवश्यकता होती है।
आगे पढ़ने क्यों विरासत अक्सर एक समस्याग्रस्त विचार है:
वंशानुक्रम को आमतौर पर ओओपी समर्थकों द्वारा एक बुरी बात के रूप में क्यों देखा जाता है
JavaWorld: क्यों फैली बुराई है
गुणों का एक सेट बनाने के लिए इंटरफेस के एक सेट को लागू करने के साथ समस्या
जब आप विस्तार के लिए इंटरफेस का उपयोग करते हैं तो सब कुछ ठीक है जब तक कि आपके पास उनमें से बस एक छोटा सा सेट है। खासतौर पर तब जब आपकी कंपनी में आपके डेवलपर मॉडल का उपयोग और विस्तार किया जाता है, जैसे आपकी कंपनी में इंटरफेस की मात्रा बढ़ेगी। और अंत में आप एक नया आधिकारिक "प्रॉपर्टी-इंटरफ़ेस" बनाते हैं, जो आपके सहयोगियों द्वारा पहले से ही ग्राहक के एक्स के लिए एक पूरी तरह से असंबंधित उपयोग के मामले में एक विधि को जोड़ता है - ऊग।
संपादित करें: gnasher729 द्वारा एक और महत्वपूर्ण पहलू का उल्लेख किया गया है । आप अक्सर किसी मौजूदा ऑब्जेक्ट में वैकल्पिक रूप से वैकल्पिक गुण जोड़ना चाहते हैं। वंशानुक्रम या इंटरफेस के साथ आपको पूरी वस्तु को दूसरी कक्षा के साथ फिर से बनाना होगा जो कि वैकल्पिक से दूर है।
जब आप अपने ऑब्जेक्ट मॉडल के विस्तार की उम्मीद इस हद तक करते हैं तो आप गतिशील विस्तार की संभावना को स्पष्ट रूप से मॉडलिंग करके बेहतर होंगे । मैं ऊपर की तरह कुछ प्रस्तावित करता हूं जहां प्रत्येक "विस्तार" (इस मामले में संपत्ति) का अपना वर्ग होता है। वर्ग विस्तार के लिए नाम स्थान और पहचानकर्ता के रूप में काम करता है। जब आप पैकेज नामकरण सम्मेलनों को निर्धारित करते हैं, तो इस तरह से मूल इकाई वर्ग में विधियों के नाम स्थान को प्रदूषित किए बिना अनंत विस्तार देता है।
खेल के विकास में आप अक्सर परिस्थितियों का सामना करते हैं जहां आप व्यवहार और डेटा को कई रूपों में रचना करना चाहते हैं। यही कारण है कि आर्किटेक्चर पैटर्न यूनिट-कंपोनेंट-सिस्टम गेम डेवलपमेंट सर्किल में काफी लोकप्रिय हुआ। यह भी एक दिलचस्प दृष्टिकोण है जिसे आप देखना चाहते हैं, जब आप अपने ऑब्जेक्ट मॉडल के कई एक्सटेंशन की उम्मीद करते हैं।