मैं अपनी परियोजना में कक्षा पदानुक्रम पर काम कर रहा हूं और मूल रूप से मेरे पास आपके प्रश्न में वर्णित समान स्थिति है।
मान लें कि मेरे पास बेस टाइप ऑब्जेक्ट है जो मेरे टूलकिट में अन्य सभी वर्गों की पूर्ण जड़ है। तो स्वाभाविक रूप से सब कुछ सीधे या इसके उप-वर्गों से प्राप्त होता है। एक सामान्य कार्यक्षमता है कि प्रत्येक ऑब्जेक्ट-व्युत्पन्न वर्ग को प्रदान करना होता है लेकिन कुछ पत्ते वर्गों के प्रभाव में दूसरों की तुलना में थोड़ा अलग होता है। उदाहरण के लिए प्रत्येक ऑब्जेक्ट में आकार और स्थिति होती है जिसे गुण या विधियों जैसे स्थिति = नए बिंदु (10, 10), चौड़ाई = 15, आदि के साथ बदला जा सकता है लेकिन ऐसे वर्ग हैं जिन्हें किसी संपत्ति की सेटिंग को अनदेखा करना चाहिए या स्वयं के अनुसार इसे संशोधित करना चाहिए आंतरिक राज्य पैरेंट विंडो के बाईं ओर डॉक किए गए नियंत्रण के बारे में सोचें। आप अपनी पसंद की ऊँचाई संपत्ति सेट कर सकते हैं लेकिन इसे आम तौर पर अनदेखा कर दिया जाएगा क्योंकि यह संपत्ति वास्तव में मूल कंटेनर नियंत्रण की ऊंचाई पर निर्भर करती है (या यह क्लाइंट एरिया ऊंचाई या उस तरह की sth) है।
इसलिए ऑब्जेक्ट अमूर्त वर्ग मूल सामान्य कार्यक्षमता को कार्यान्वित करना ठीक है जब तक कि आप उस बिंदु तक पहुंच न जाएं जहां आपको "कस्टमाइज़" व्यवहार की आवश्यकता होती है।वस्तु संरक्षित आभासी SetHeight विधि है कि ऊंचाई संपत्ति के सेटर में कहा जाता है प्रदान करता है, तो आप इसे ओवरराइड में आप वर्ग DockedControl और ऊंचाई के परिवर्तन की अनुमति केवल तभी डॉकिंग कोई नहीं, अन्य मामलों में आप इसे सीमित या पूरी तरह से उपेक्षा में है सकता है।
तो हम खुश हैं लेकिन अब हमें ऑब्जेक्ट की आवश्यकता है जो क्लिक या होवर जैसे माउस ईवेंट पर प्रतिक्रिया करे। इसलिए हम सार ऑब्जेक्ट क्लास से MouseAwareObject प्राप्त करते हैं और ईवेंट और सामान लागू करते हैं।
और अब क्लाइंट डॉक्यूबल, माउस जागरूक ऑब्जेक्ट्स चाहता है। तो हम डॉकबल ऑब्जेक्ट से प्राप्त करते हैं और ... हम्म, अब क्या? यदि हम एकाधिक विरासत कर सकते हैं तो हम इसे कर सकते हैं लेकिन हमने डुप्लिकेट इंटरफ़ेस की अस्पष्टता के साथ हीरा समस्या को मारा और हमें इससे निपटने की आवश्यकता है। कार्यक्षमता प्रदान करने के लिए हमारे पास नए वर्ग और प्रॉक्सी बाहरी कॉल में दो प्रकार के डॉकेबल और माउसएवेयर प्रकार हो सकते हैं।
और आखिरी चीज जो दिमाग में आती है वह है IDockable और IMouseAware इंटरफेस बनाने और उन्हें कार्यक्षमता को परिभाषित करने और उन्हें केवल उन वस्तुओं के लिए जोड़ें जो ठोस व्यवहार/कार्यान्वयन प्रदान करने की आवश्यकता है।
मुझे लगता है कि मैं अपनी बेस क्लास को भागों में विभाजित कर दूंगा और मेरे ऑब्जेक्ट को गुणों और विधियों के बहुत सीमित "कोर" सेट के साथ छोड़ दूंगा और बाकी कार्यक्षमता जो वास्तव में ऑब्जेक्ट्स के लिए वैकल्पिक रूप से वैकल्पिक है लेकिन ठोस मामलों में आवश्यक है इरजेज़ेबल, आईडीकेबल, इमेकएवर्ल्डबैटरप्लेसप्लेसएबल इत्यादि जैसे इंटरफेस इत्यादि। इस समाधान के साथ ऑब्जेक्ट-व्युत्पन्न कक्षाओं के व्यवहार को रूट बेस क्लास से ड्रैगन वर्चुअल या शुद्ध वर्चुअल (अमूर्त) विधियों के बिना सभी तरह से पत्ती वर्ग तक "संलग्न" करना संभव है।
सभी प्रभावित वर्गों में इंटरफेस को लागू करने की असुविधा होती है लेकिन आप हमेशा कुछ "एडेप्टर" को लागू कर सकते हैं और केवल उन्हें कॉल अग्रेषित कर सकते हैं। इस तरह आपके पास डुप्लीकेट कार्यान्वयन नहीं है (कुछ विस्तार के लिए) और कार्य के अहसास के बीच decoupling है (आकार का मतलब विभिन्न वर्गों के लिए अलग-अलग चीजों का मतलब हो सकता है) और ग्राहक कोड की अपेक्षा।
शायद यह आपके प्रश्न के लिए आदर्श उत्तर नहीं है लेकिन शायद यह आपको अपने समाधान के लिए संकेत देगा।
पिछले उत्तर में से कोई एक क्यों हटा दिया गया है ??? –
यह प्रश्न __not भाषा agnostic__ नहीं है, यदि आप थे, तो आप मिक्सिन्स का उपयोग करने जैसे अधिक सुरुचिपूर्ण विकल्पों पर विचार कर सकते हैं, जो आपके द्वारा वर्णित भाषा की प्रकृति (इंटरफेस का उपयोग करते हुए मैं सी # या जावा मानता हूं?) –
@ पाब्लो फर्नांडीज मिक्सिन वह नाम है जो मुझे लगता है कि पहला समाधान –