2011-03-04 8 views
5

मैं ओओपीएस और डिजाइन पैटर्न में एक विशेषज्ञ नहीं हूं।एक कार के बम्पर स्टिकर सबक्लास के साथ एक कार है?

मैं इस स्थिति में आया हूं: क्या एक कार एक बम्पर स्टिकर उप-कार वाली कार है?

यदि नहीं तो मैं किसी ऑब्जेक्ट के उदाहरण के लिए गतिशील गुण कैसे जोड़ सकता हूं? उदाहरण के लिए एक कार, बम्पर स्टिकर इत्यादि वाली एक कार

सभी कारें बम्पर स्टिकर के साथ नहीं आतीं। कोई एक बम्पर स्टिकर और यहां तक ​​कि एक से अधिक बम्पर स्टिकर जोड़ सकता है। मैं कार के साथ एक स्टिकर को लागू नहीं कर सकता, afaik, मुझे लागू करने से मुझे स्टिकर जोड़ने के लिए मजबूर किया जाएगा। एक कार पर एक बम्पर स्टिकर एक नई संपत्ति है जो कार (ऑब्जेक्ट?) के बाद अस्तित्व में आई थी।

+0

बम्पर स्टिकर की आपकी राय पर निर्भर करता है। कारों (spoilers, बर्फ टायर, एंटीना) में हर मिनट भिन्नता के लिए subclass करना दर्द होगा। सवाल वास्तव में उत्तरदायी नहीं है। –

+1

नहीं - स्टिकर वाली एक कार अभी भी एक कार है - शायद इसकी एक विशेषता बदल गई है, लेकिन यह सबक्लास नहीं है, मैं तर्क दूंगा। –

+3

कृपया निम्नलिखित प्रश्नों का उत्तर दें: क्या प्रत्येक कार में बम्पर स्टिकर हो सकता है? बम्पर स्टिकर वाली कार का व्यवहार बिना किसी कार के व्यवहार से अलग होता है? यदि कार में उनमें से कई हैं तो व्यवहार में क्या बदलाव की उम्मीद है? – Philipp

उत्तर

7

आप इस तरह के मामलों के लिए Decorator Design Pattern का उपयोग कर सकते हैं। यह आपको "ऑब्जेक्ट के उदाहरण के लिए गतिशील गुणों को जोड़ने" की अनुमति देगा, जो आपने उल्लेख किया है, आप अपने car कक्षा को "सजाने" द्वारा किए गए सभी संयोजनों में स्टिकर या किसी अन्य संपत्ति का कोई भी जोड़ जोड़ सकते हैं।

+0

धन्यवाद :) मैं कॉफी उदाहरण के साथ कुछ समय बिताने जा रहा हूं – Kumar

1

यदि आपके मामले में बम्पर स्टिकर एक आम बात है, तो आप एक बूलियन विशेषता (सत्य/गलत) या एक स्ट्रिंग सेट कर सकते हैं यदि यह आपके मामले में है।

यदि बम्पर स्टिकर स्वयं की कक्षा बनने के लिए जटिल है, तो शायद कार को स्टिकर को कार्यान्वित करना चाहिए? (मैं यहां जावा में कार्यान्वयन का जिक्र कर रहा हूं)

गतिशील के रूप में, क्या कार से संबंधित गुणों की डेटाबेस तालिका स्वीकार्य होगी?

+0

मुझे लगता है कि ऊपर की तरह कुंजी है, बम्पर स्टिकर कॉम्प्लेक्स पर्याप्त है जिसके लिए अपनी कक्षा की आवश्यकता होती है? क्या आप रिकॉर्ड कर रहे हैं कि एक बम्पर स्टिकर मौजूद है या इसका विवरण? अन्यथा 0 या अधिक स्टिकर के लिए एक बूलियन है, गिनती के लिए पूर्णांक इत्यादि। – Karl

+0

यह एक अच्छा डिज़ाइन नहीं लेता है, बम्पर स्टिकर पूरी तरह से वैकल्पिक है, लेकिन कार या यहां तक ​​कि बाइक पर भी हो सकता है, यदि इसका छोटा सा पर्याप्त – Kumar

0

असल में, जब आप कोई कार खरीदते हैं तो आप कार स्वयं और विकल्पों का एक सेट (संगीत, इंटीरियर इत्यादि) चुनते हैं। वास्तविक जीवन में आप अपनी कार कक्षा में 'विकल्प' पेश कर सकते हैं। एक साधारण मामला यह (C++) की तरह लग रहा है:

class Car { 

    enum CarOptions { 
     Bumper, 
     ... 
    }; 

    ... 

    int options() const { return m_options; } 
    void setOptions(int options) { m_options = options } 

    ... 
}; 

Car c; 
c.setOptions(c.options() | Car::Bumper); 
बेशक

, इस समाधान यह खुद पक्ष-विपक्ष है, किसी अन्य के रूप में है।

+0

कर सकता है आप पेशेवरों और विपक्ष को सूचीबद्ध करते हैं? – Kumar

+0

समर्थक: सरल; con: केवल एक बुलियन संकेत है कि एक विकल्प सेट किया गया है, कोई अन्य जानकारी संग्रहीत नहीं की जा सकती है (जैसे स्टिकर पर मुद्रित किया गया है) – Tony

+0

पेशेवर: इसका उपयोग करना बहुत आसान है और जब आपके पास विकल्पों का एक समूह होता है तो यह उपयोगी होता है (1 नहीं या 2 लेकिन 10 या 20)। विपक्ष: यदि बम्पर जटिल है तो आपको शायद अन्य समाधान का उपयोग करना चाहिए। तो यह निर्भर करता है। – maverik

1

इसे कम न करें।

class Car 
{ 
public: 
    bool hasBumperSticker() const { return m_hasBumperSticker; } 

private: 
    bool m_hasBumperSticker; 
}; 

या, यदि बम्पर स्टीकर अपने स्वयं के गुण है:

class Car 
{ 
public: 
    bool hasBumperSticker() const { return m_bumperSticker != 0; } 

private: 
    BumperSticker* m_hasBumperSticker; 
}; 
+0

बम्पर स्टिकर एक उदाहरण है, मैं कई अन्य गुण जोड़ सकता हूं, इसलिए आपके अनुसार, मुझे उन सभी गुणों के लिए एक हैप्रॉपटीएक्स() विधि की आवश्यकता होगी, यहां है कुछ चीज जो मुझे अभी अटक गई 'कोड' कक्षा कार { \t निजी संपत्ति; \t सार्वजनिक hasProperty (प्रॉपर्टी) {वापसी (isset (this.proprtyarray [प्रॉपर्टी]) सच: गलत);} \t सार्वजनिक setProperty (प्रॉपर्टी, मूल्य) {this.proprtyarray [प्रॉपर्टी] = मूल्य;} } ' कोड ' – Kumar

2

कार में परिवर्तन की बात कर रहे डायनामिक विशेषताएं हैं। व्यक्तिगत रूप से मैं कार वर्ग में सहायक उपकरण का संग्रह लागू करता हूं, जिनमें से एक बम्परस्टिकर होगा।

फिर आप उपलब्ध सभी विकल्पों के लिए कार को उपclass किए बिना सहायक उपकरण जोड़ और निकाल सकते हैं।

यदि आप विरासत मार्ग पर जाते हैं तो स्थिति के बारे में सोचते हैं जब एक कार में बम्परस्टिकर और स्पोइलर होते हैं, तो आपके पास सी ++ में कई विरासत होती है जो अन्य भाषाओं में उपलब्ध नहीं होती है।

+0

यह इस मामले में * तर्कसंगत * पर भी फंस गया है, क्योंकि बम्पर स्टिकर वाली कार और spoilers के साथ एक कार दो अलग-अलग प्रकार की कार नहीं है। वे एक प्रकार की कार के गुण हैं। –

+0

बिल्कुल, एक बम्पर स्टिकर सिर्फ एक कार की "अन्य" विशेषता या संपत्ति है जो आपकी कार में हो सकती है और मेरी कमी हो सकती है – Kumar

संबंधित मुद्दे