मैं अक्सर शुद्ध आभासी कक्षाओं (इंटरफेस) का उपयोग मेरे वर्तमान परियोजना में विभिन्न वर्गों के कार्यान्वयन के बीच निर्भरता कम करने के लिए। मेरे लिए पदानुक्रम भी असामान्य नहीं है जिसमें मेरे पास शुद्ध वर्चुअल और गैर शुद्ध वर्चुअल क्लासेस हैं जो अन्य शुद्ध आभासी कक्षाओं का विस्तार करते हैं। यहाँ ऐसी स्थिति का एक उदाहरण है:क्या यह शुद्ध वर्चुअल (इंटरफ़ेस) कक्षाओं से लगभग प्राप्त करने के लिए एक अच्छा सम्मेलन है?
class Engine
{ /* Declares pure virtual methods only */ }
class RunnableEngine : public virtual Engine
{ /* Defines some of the methods declared in Engine */ }
class RenderingEngine : public virtual Engine
{ /* Declares additional pure virtual methods only */ }
class SimpleOpenGLRenderingEngine : public RunnableEngine,
public virtual RenderingEngine
{ /* Defines the methods declared in Engine and RenderingEngine (that are not
already taken care of by RunnableEngine) */ }
दोनों RunnableEngine
और RenderingEngine
विस्तार Engine
लगभग इतना है कि हीरे की समस्या SimpleOpenGLRenderingEngine
प्रभावित नहीं करता।
मैं समस्या होने पर इसके साथ निपटने के बजाय हीरे की समस्या के खिलाफ निवारक रुख लेना चाहता हूं, खासकर जब से मैं कोड लिखना पसंद करता हूं जो किसी और के लिए जितना संभव हो सके उपयोग करना आसान है और मैं नहीं चाहता उन्हें मेरी कक्षाओं को संशोधित करना होगा ताकि वे विशेष श्रेणी के उत्तराधिकारी बना सकें यदि बॉब यह करने के लिए चाहता था:
class BobsRenderingEngine : public virtual RenderingEngine
{ /* Declares additional pure virtual methods only */ }
class BobsOpenGLRenderingEngine : public SimpleOpenGLRenderingEngine,
public BobsRenderingEngine
{ /* Defines the methods declared in BobsRenderingEngine */ }
यह संभव नहीं हो अगर मैं SimpleOpenGLRenderingEngine
लगभग विस्तार RenderingEngine
नहीं बनाया था होगा। मुझे पता है कि बॉब की संभावना यह करने के लिए बहुत कम हो सकती है।
इसलिए, मैंने हमेशा शुद्ध वर्चुअल कक्षाओं को विस्तारित करने के सम्मेलन का उपयोग करना शुरू कर दिया है ताकि उनमें से कई विरासत हीरे की समस्या का कारण न हो। शायद यह जावा से आने के कारण है और केवल गैर विरासत वर्चुअल कक्षाओं के साथ एकल विरासत का उपयोग करने के लिए है। मुझे यकीन है कि यह शायद कुछ परिस्थितियों में अधिक है लेकिन क्या इस सम्मेलन का उपयोग करने के लिए कोई डाउनसाइड्स है? क्या यह प्रदर्शन/कार्यक्षमता इत्यादि के साथ कोई समस्या पैदा कर सकता है? यदि नहीं, तो मुझे सम्मेलन का उपयोग न करने का कोई कारण नहीं दिखता है, भले ही इसे अंत में अक्सर आवश्यकता न हो।
यूप, पूर्ण ओवरकिल। यह केवल वास्तविक हीरा समस्या है जब आपके पास से चुनने के लिए एकाधिक * कार्यान्वयन * होते हैं। इंटरफ़ेस में कोई समस्या नहीं है, इसमें कोई कार्यान्वयन नहीं है। वर्चुअल विरासत एक बैंड-एड्स है, जब आप दीवार के खिलाफ हैं तो आप इसका उपयोग केवल तभी करते हैं। –
@ हंसपैसेंट, मैं आपसे सहमत नहीं हूं। डिमांड समस्या अक्सर शुद्ध आभासी कक्षाओं के साथ भी हो सकती है। मान लें कि आपके पास एक इंटरफेस है, आईए कहें, और इसका डिफ़ॉल्ट कार्यान्वयन 'एआईएमपीएल: पब्लिक वर्चुअल आईए', फिर वर्चुअल विरासत का उपयोग करके आप 'क्लास बी: पब्लिक वर्चुअल आईए, पब्लिक एआईएमपीएल' परिभाषित कर सकते हैं। इस प्रकार बी एआईएमएल के आईए के कार्यान्वयन का उपयोग करेगा। –
@kids_fok Yup, यह वही है जहां मुझे समस्या है। खैर, मुझे यकीन नहीं है कि आपके प्रश्न में स्पष्ट रूप से 'आईए' को विस्तारित करने के लिए आपको 'बी' की आवश्यकता है, उदाहरण के लिए मेरे प्रश्न में उदाहरण समान है। –