कुछ शोधों को करने के बाद मैं एक साधारण उदाहरण को खोजने में प्रतीत नहीं हो सकता है जो एक समस्या का समाधान करता है जिसका मैं अक्सर सामना करता हूं।
मान लीजिए कि मैं एक छोटा अनुप्रयोग बनाना चाहता हूं, जहां मैं Square
s, Circle
s और अन्य आकार बना सकता हूं , उन्हें स्क्रीन पर प्रदर्शित कर सकता हूं, उनके चयन के बाद उनके गुणों को संशोधित कर सकता हूं और फिर उनकी सभी परिधि की गणना कर सकता हूं।
मैं मॉडल वर्ग को इस तरह से करूंगा:
class AbstractShape
{
public :
typedef enum{
SQUARE = 0,
CIRCLE,
} SHAPE_TYPE;
AbstractShape(SHAPE_TYPE type):m_type(type){}
virtual ~AbstractShape();
virtual float computePerimeter() const = 0;
SHAPE_TYPE getType() const{return m_type;}
protected :
const SHAPE_TYPE m_type;
};
class Square : public AbstractShape
{
public:
Square():AbstractShape(SQUARE){}
~Square();
void setWidth(float w){m_width = w;}
float getWidth() const{return m_width;}
float computePerimeter() const{
return m_width*4;
}
private :
float m_width;
};
class Circle : public AbstractShape
{
public:
Circle():AbstractShape(CIRCLE){}
~Circle();
void setRadius(float w){m_radius = w;}
float getRadius() const{return m_radius;}
float computePerimeter() const{
return 2*M_PI*m_radius;
}
private :
float m_radius;
};
(कल्पना करें कि मेरे पास आकृतियों की अधिक कक्षाएं हैं: त्रिकोण, हेक्सागोन्स, हर बार उनके प्रॉपर वैरिएबल और संबंधित गेटर्स और सेटर के साथ। मुझे जिन समस्याओं का सामना करना पड़ा उनमें 8 उपवर्ग थे लेकिन उदाहरण के लिए मैं 2 पर ही रुक गया।
अब मेरे पास एक ShapeManager
सरणी में सभी आकृतियों को संकलित करने और संग्रहीत करने के लिए है:
class ShapeManager
{
public:
ShapeManager();
~ShapeManager();
void addShape(AbstractShape* shape){
m_shapes.push_back(shape);
}
float computeShapePerimeter(int shapeIndex){
return m_shapes[shapeIndex]->computePerimeter();
}
private :
std::vector<AbstractShape*> m_shapes;
};
अंत में, मेरे पास प्रत्येक प्रकार के आकार के लिए प्रत्येक पैरामीटर को बदलने के लिए स्पिनबॉक्स के साथ एक दृश्य है। उदाहरण के लिए, जब मैं स्क्रीन पर एक वर्ग का चयन करता हूं, तो पैरामीटर विजेट केवल- Square
संबंधित पैरामीटर (धन्यवाद AbstractShape::getType()
) प्रदर्शित करता है और वर्ग की चौड़ाई को बदलने का प्रस्ताव करता है। ऐसा करने के लिए मुझे एक फ़ंक्शन की आवश्यकता है जिससे मैं चौड़ाई को संशोधित कर सकूं ShapeManager
और यह है कि मैं यह कैसे करूं:
void ShapeManager::changeSquareWidth(int shapeIndex, float width){
Square* square = dynamic_cast<Square*>(m_shapes[shapeIndex]);
assert(square);
square->setWidth(width);
}
क्या मेरे द्वारा उपयोग dynamic_cast
किए जाने वाले ShapeManager
प्रत्येक उपवर्ग चर के लिए एक गेट्टर / सेटर जोड़ी को लागू करने और उसका उपयोग करने के लिए मुझसे बचने के लिए एक बेहतर डिज़ाइन है? मैंने पहले ही टेम्प्लेट का उपयोग करने की कोशिश की लेकिन असफल रहा ।
समस्या मैं का सामना करना पड़ रहा हूँ आकृतियाँ साथ लेकिन साथ वास्तव में नहीं है अलग Job
रों : (उदा एक 3 डी प्रिंटर के लिए PrintPatternInZoneJob
, TakePhotoOfZone
आदि) के साथ AbstractJob
उनके आधार वर्ग के रूप में। आभासी विधि है execute()
और नहीं getPerimeter()
। नौकरी के लिए आवश्यक विशिष्ट जानकारी को भरने के लिए मुझे केवल ठोस उपयोग की आवश्यकता है :
PrintPatternInZone
प्रिंट करने के लिए अंकों की सूची, ज़ोन की स्थिति, तापमान जैसे कुछ मुद्रण पैरामीटर की आवश्यकता होती हैTakePhotoOfZone
जरूरत है कि किस क्षेत्र को फोटो में लिया जाए, वह मार्ग जहां फोटो को सहेजा जाएगा, आयाम, आदि ...
जब मैं फोन करूंगा execute()
, जॉब्स को उन विशिष्ट सूचनाओं का उपयोग करना होगा जो उन्हें उस कार्रवाई का एहसास करना है जो वे करने वाले हैं।
केवल एक बार मुझे नौकरी के ठोस प्रकार का उपयोग करने की आवश्यकता होती है, जब मैं थिसिस informations भरता हूं या प्रदर्शित करता हूं (यदि TakePhotoOfZone
Job
यह चुना गया है, तो क्षेत्र, पथ और आयाम मापदंडों को प्रदर्शित करने और संशोधित करने वाला एक विजेट दिखाया जाएगा)।
Job
रों तब की एक सूची में डाल दिया जाता है Job
रों जो पहली नौकरी ले, वह निष्पादित (फोन करके AbstractJob::execute()
), अगली सूची के अंत तक पर और पर, को जाता है। (यही कारण है कि मैं विरासत का उपयोग करता हूं)।
विभिन्न प्रकार के मापदंडों को संग्रहीत करने के लिए मैं एक का उपयोग करता हूं JsonObject
:
फायदे: किसी भी नौकरी के लिए एक ही संरचना, पैरामीटर सेट करते या पढ़ते समय कोई डायनेमिक_कास्ट नहीं
समस्या: संकेत (
Pattern
या करने के लिएZone
) स्टोर नहीं कर सकते
क्या आप डेटा स्टोर करने का एक बेहतर तरीका है?
फिर जब आप उस प्रकार के विशिष्ट मापदंडों को संशोधित करना होगा, तो आपJob
इसका उपयोग करने के लिए ठोस प्रकार को कैसे स्टोर करेंगे ? JobManager
की एक सूची है AbstractJob*
।
changeValue(int shapeIndex, PropertyKey propkey, double numericalValue)
कहां PropertyKey
हो सकती है, और "चौड़ाई" (जो दर्शाता है कि सेटर को कॉल चौड़ाई का मूल्य अपडेट करेगा) अनुमत मानों में से एक है।