2012-07-17 26 views
7

क्या दूसरा मामला लागू करने का एकमात्र बिंदु यह है कि यदि मैं ऑब्जेक्ट के बिना कोलिडेबल से प्राप्त करना चाहता हूं? यदि ऐसा है, तो दूसरा मामला कभी भी अनुकूल होगा जब दूसरा मामला अधिक लचीलापन प्रदान करता है।किस प्रकार की विरासत अधिक बेहतर है?

दोनों कोलेडबल्स के पास केवल एक शुद्ध वर्चुअल फ़ंक्शन है और ऑब्जेक्ट उन ऑब्जेक्ट्स के लिए बेस क्लास है जिन्हें स्क्रीन पर खींचा जा सकता है (मेरे मामले में)।

^मान लिया जाये कि मैं निम्नलिखित कोड सही तरीके से समझने रहा हूँ (मैं भी यकीन नहीं कर रहा हूँ TBH)

class Object 
class CollidableObject : Object 
class Actor : public CollidableObject 

class Object 
class Collidable 
class Actor : public Object, public Collidable 

संपादित करें:

मैट के आधार पर/सेठ

class Object 
class Collidable 
class Clickable 
class Trackable 
class BlowUppable 
class Actor : public Object, public Collidable, public Clickable, public Trackable, 
       public BlowUppable 

class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor 

पहले उदाहरण दूसरा मामला है और दूसरा उदाहरण पहला मामला है। मुझे लगता है कि एकमात्र उपयोग मैं पहले मामले के लिए देखता हूं।

@ लचियन
यह उत्तर मूल से एक अलग सवाल होने जा रहा है क्योंकि आपका जवाब न तो था।

इस मामले में, क्या किसी वस्तु से किसी वस्तु को बदलने का कोई अंतर है? प्रत्येक मामले में, टकराव की जांच करने के लिए, किसी ऑब्जेक्ट को ध्वज होना चाहिए कि टकराव की जांच की जानी चाहिए या नहीं। आपके मामले में, सदस्य को चेक किया जा सकता है अगर इसकी शून्य या नहीं, लेकिन व्युत्पन्न मामले में, ऑब्जेक्ट स्वयं ही बताता है कि यह टकरा सकता है या नहीं। एक सरणी/पेड़ में, मैं या तो व्युत्पन्न वस्तु को एक तर्क के रूप में पास कर सकता हूं या get() विधि का उपयोग कर तर्क के रूप में हिटबॉक्स पास कर सकता हूं।

गहराई में अधिक होने के लिए, मैं एक वर्ग है - दूसरे मामले

class Hitbox : public Object, public Collidable 

और अभिनेता वर्ग का उपयोग कर एक सदस्य के रूप में यह है

class Actor : public Object 
{ 
    Hitbox *box; 
}; 

वस्तुओं है कि टक्कर एक hitbox होता इसके बजाए और यह आपकी पोस्ट को सटीक रूप से दर्शाता है। लेकिन मुझे अभी भी क्या मिल रहा है कि जब मैं फिर से आपके उदाहरण की समीक्षा करता हूं, तो क्या इसका मतलब यह है कि हिटबॉक्स के बजाय एक कोलाइडबल सदस्य होना चाहिए?

class Hitbox 
{ 
    Collidable *collision; 
}; 

मैं क्या है: एक सदस्य

अभिनेता पहले से ही पीछा कर रहा है के रूप में
इनहेरिट Collidable या
Have Collidable:
एक अभिनेता के एक HitBox जो टक्कर

क्या HitBox करना चाहिए संभालती रखती है आपका सम्मेलन क्या हिटबॉक्स एक ही करना चाहिए?

उत्तर

2

मैं दूसरा मामला करूंगा, क्योंकि Object और Collidable क्रॉस-कटिंग चिंताओं हैं। यदि आप CollidableObject मार्ग पर जाते हैं, तो आप शायद कक्षाओं के एक संयोजन के साथ समाप्त हो जाएंगे। यह तब तक लंबा नहीं होगा जब तक आप CollidableTrackableClickableBlowuppableObject नहीं देखते।

चूंकि Collidable शुद्ध वर्चुअल है, इसका उपयोग इस मामले में एक इंटरफ़ेस के रूप में किया जाता है, इसलिए कई विरासतों के खिलाफ बहस करने वाली कई आलोचनाएं नहीं होती हैं। आप बस यह कह रहे हैं कि एक अभिनेता Collidable इंटरफ़ेस लागू करता है।

+0

यदि आपने पहले किया था तो आपको 'CollidableTrackableClickableBlowuppableObject' नहीं होना चाहिए; यह केवल एक वर्ग होगा जो 'कोलाइडेबल', 'ट्रैक करने योग्य', 'क्लिक करने योग्य' और 'ब्लोउपबल' से विरासत में मिला है, जैसा कि पहले तरीके से है, लेकिन आप पहले 'ऑब्जेक्ट' का उत्तराधिकारी नहीं होंगे। मुझे यकीन नहीं है कि पहला व्यक्ति अधिक उपयोगी है; क्या स्क्रीन पर सभी क्लिक करने योग्य नहीं हो सकते हैं? यदि आपके पास सभी अलग हैं, तो आप यह नहीं बता सकते कि आपका 'ऑब्जेक्ट' क्लिक करने योग्य है या यदि आपका 'क्लिक करने योग्य' ड्रायबल है। दूसरी तरफ, आप जानते हैं कि 'क्लिक करने योग्य' खींचने योग्य है। –

+1

आपको एक नहीं होना होगा ... अगर आपने _second_ किया था तो मेरा कहना था। –

1

यह strategy pattern के लिए एक आदर्श परिदृश्य है। यह वह जगह है जहां अंग्रेजी भाषा हमारे दिमाग पर चाल चलती है और हमें लगता है कि CollidableObject इस पदानुक्रम में एक वैध वस्तु है। मैं कहता हूं कि टकराव एक वस्तु से अधिक व्यवहार है, इसलिए मैं दोनों में से किसी के साथ नहीं जाऊंगा।

इस के लिए रचना पसंद करते हैं:

class Object 
{ 
    CollidableBehavior* collisionBehavior; 
} 
class Actor : Object 
{ 
    // collisionBehavior = new ActorCollision() 
} 

class AClassThatDoesntCollide 
{ 
    // collisionBehavior = NULL 
} 
+0

यदि टकराव का व्यवहार अभिनेता वर्ग के विनिर्देशों पर निर्भर करता है, तो यह बहुत व्यावहारिक नहीं होगा। दूसरी ओर यदि यह एक स्वतंत्र विशेषता है, तो यह अच्छी समझ में आता है। –

0

2 मामले को लागू करने में केवल एक बिंदु नहीं है, तो मैं एक वस्तु किया जा रहा बिना एक Collidable से प्राप्त करने के लिए करना चाहते हैं?

हां, दूसरा मामला आपको अधिक लचीलापन देता है क्योंकि यह इंटरफेस को अलग करने की अनुमति देता है। उदाहरण के लिए, बाद में आप एक ऑब्जेक्ट चाहते हैं जो टकराव योग्य हो लेकिन यह ड्रॉइंग नहीं है।

दूसरा मामला कभी भी अनुकूल है जब दूसरा मामला अधिक लचीलापन प्रदान करता है।

दूसरा मामला अधिक लचीलापन प्रदान करता है लेकिन यह डिजाइन करने के लिए भी अधिक जटिल है। अंत में, आपको आभासी विरासत की आवश्यकता होगी और इसे संभालना अधिक कठिन है। हालांकि, यदि आपकी आधार कक्षाएं शुद्ध सार हैं तो यह कोई समस्या नहीं होनी चाहिए।

आप this देख सकते हैं।

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