मैं संवाद जैसे उपयोगकर्ता इंटरफ़ेस घटकों को बनाने के लिए एक सार कारखाना का उपयोग कर रहा हूं। उपयोग किए जाने वाले अमूर्त कारखाने को वर्तमान में चयनित जेनेरिक "इनोड" से वापस कर दिया जाता है जो कई अलग-अलग प्रकार के नोड के लिए बेस क्लास है। तो उदाहरण के लिए, अगर मैं चयनित नोड के रूप में एक ही प्रकार के एक नए नोड जोड़ना चाहते हैं, परिदृश्य कुछ इस प्रकार है:अमूर्त कारखाने का उपयोग करने में समस्या
(कृपया ध्यान दें इस अर्द्ध छद्म कोड है)
उपयोगकर्ता क्लिक करता है नोड और नोड बाद में उपयोग के लिए भंडारित किया जाता है:
void onAddClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createAddDialog(parentWidget);
dialog->show();
}
सब ठीक लग रहा है कौन सा:
void onTreeNodeSelected(INode *node)
{
selectedNode = node;
}
उपयोगकर्ता यूजर इंटरफेस पर "जोड़ें" क्लिक करता है। समस्या तब आती है जब मैं चयनित नोड को संपादित करना चाहता हूं:
void onEditClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createEditDialog(selectedNode, parentWidget);
dialog->show();
}
ओह प्रिय .. मैं एक इनोड ऑब्जेक्ट में जा रहा हूं। किसी बिंदु पर मुझे सही नोड प्रकार के लिए डाउनकास्ट करना होगा ताकि संवाद ठीक से इसका उपयोग कर सके।
मैंने "PostgreSQL व्यवस्थापक 3" स्रोत कोड का अध्ययन किया है, और वे इसके समान कुछ करते हैं। वे ऐसा कुछ करने से गोल करते हैं:
FooObjectFactoryClass::createDialog(IObject *object)
{
FooObjectDialog *dialog = new FooObjectDialog((FooObject*)object);
}
येक .. कास्ट!
FooNode : INode
{
FooNodeFactory* FooNode::getFactory()
{
fooNodeFactory->setFooNode(this);
return fooNodeFactory;
}
}
तो फिर मेरे संपादन घटना यह कर सकते हैं:
एक ही रास्ता मैं इसे चारों ओर सोच सकते हैं और अभी भी अपने कारखानों उपयोग करने में सक्षम होने से पहले ही दिया जाता है कारखाने में नोड खुद इंजेक्षन करने के लिए है
void onEditClicked()
{
IFactory *factory = selectedNode->getFactory();
Dialog *dialog = factory->createEditDialog(parentWidget);
dialog->show();
}
और यह संदर्भ के लिए इंजेक्शन नोड का उपयोग करेगा।
मुझे लगता है कि कोई इंजेक्शन कोड नहीं है, तो createEditDialog झूठी या कुछ कह सकता है।
कोई विचार?
धन्यवाद!