इस मामले में, महत्वपूर्ण बात यह है कि अगर आप दो वस्तुओं तुलना, तुम वापस एक परिणाम मिलता है।
तो मूल रूप से, आपको इस तुलना को इस तरह से कम करने की आवश्यकता है कि आप न केवल मिश्रण में एक नया प्रकार का ऑब्जेक्ट जोड़ सकते हैं, बल्कि मिश्रण में तुलना नियम भी जोड़ सकते हैं जो इस ऑब्जेक्ट को संभाल सकता है।
अब, मैं भी कह रही है कि "कभी कभी, सवालों भी सामान्य हो सकता है" आपके प्रश्न पर टिप्पणी, और समस्या है कि यहाँ कोई कितना भी मैं आपको बता कैसे करना है क्या आप के बारे पूछना है, यह है वास्तविक समस्या के बारे में आपको थोड़ा सा मदद नहीं करेगा।
जब तक आप एक रॉक-पेपर-कैंची-एक्स गेम नहीं बना रहे हैं।
व्यक्तिगत रूप से मैं अपने स्वयं के आईओसी कंटेनर के साथ निम्नलिखित कार्य करता हूं।
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate(() => RandomRockScissorPaper());
ServiceContainer.Global.RegisterFactory<IHandComparison, DefaultHandComparison>();
(या बल्कि, मैं app.config फ़ाइल में ऊपर या इसी तरह इतना है कि यह बाद परियोजना बनाया गया है बदला जा सकता है कॉन्फ़िगर होगा)।
फिर, यदि किसी अन्य प्रकार को जोड़ने के लिए उपयोगकर्ता/ग्राहक/अंत-बिंदु को ओवरराइड करने की आवश्यकता है, तो मैं रजिस्ट्रेशन को निम्नानुसार बढ़ा दूंगा (याद रखें कि उपरोक्त app.config में हैं, इसलिए मैं उन लोगों को प्रतिस्थापित कर दूंगा नीचे):
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate(() => RandomRockScissorPaper())
.ForPolicy("original");
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate((IHandType original) => RandomRockScissorPaperBlubb(original))
.WithParameters(
new Parameter<IHandType>("original").WithPolicy("original"))
.ForPolicy("new")
.AsDefaultPolicy();
यहाँ मैं IHandType को हल करने का एक नया तरीका जोड़ने के लिए, केवल मूल रास्ता रखते हुए नहीं है, लेकिन साथ ही एक नया जोड़कर। इस नए व्यक्ति को पुराने को कॉल करने का नतीजा दिया जाएगा, और फिर आंतरिक रूप से यह तय करना होगा कि यादृच्छिक मौका चौथा प्रकार, या मूल प्रकार (तीन मूल में से एक) को वापस कर देना चाहिए या नहीं।
मैं तो भी मूल तुलना नियम को ओवरराइड होगा: है लागू करने के लिए कैसे
IHandType hand1 = ServiceContainer.Global.Resolve<IHandType>();
IHandType hand2 = ServiceContainer.Global.Resolve<IHandType>();
IHandComparison comparison = ServiceContainer.Global.Resolve<IHandComparison>();
if (comparison.Compare(hand1, hand2) < 0)
Console.Out.WriteLine("hand 1 wins");
else if (comparison.Compare(hand1, hand2) > 0)
Console.Out.WriteLine("hand 1 wins");
else
Console.Out.WriteLine("equal");
यहाँ:
public interface IHandComparison
{
Int32 Compare(IHandType hand1, IHandType hand2);
}
public class DefaultHandComparison : IHandComparison
{
public Int32 Compare(IHandType hand1, IHandType hand2)
{
... normal rules here
}
}
public class NewHandComparison : IHandComparison
{
private IHandComparison _Original;
public NewHandComparison(IHandComparison original)
{
_Original = original;
}
public Int32 Compare(IHandType hand1, IHandType hand2)
{
if hand1 is blubb or hand2 is blubb then ...
else
return _Original.Compare(hand1, hand2);
}
}
सब लिखने के बाद
ServiceContainer.Global.RegisterFactory<IHandComparison, DefaultHandComparison>()
.ForPolicy("original");
ServiceContainer.Global.RegisterFactory<IHandComparison, NewHandComparison>()
.ForPolicy("new")
.AsDefaultPolicy()
.WithParameters(
new Parameter<IHandType>("original"));
यह ऐसे इस्तेमाल किया जाएगा यह मुझे एहसास है कि मेरा ऐप.कॉन्फिग कॉन्फ़िगरेशन प्रतिनिधियों को संभालने में सक्षम नहीं होगा, इसलिए फैक्ट्री ऑब्जेक्ट डब्ल्यू इसकी आवश्यकता हो सकती है, लेकिन यह अभी भी लागू होता है।
आपको दोनों नए हाथों को प्राप्त करने के तरीके के साथ-साथ जीतने वाले हाथों के नियमों को हल करने के तरीके को हल करने में सक्षम होना चाहिए।
कभी-कभी, प्रश्न * भी * जेनेरिक हो सकते हैं। –
हां। यही कारण है कि मैंने एक बहुत ही ठोस उदाहरण रखा। आइए बस इस उदाहरण को हल करें, और मुझे कल्पना है कि हम समाधान को सामान्यीकृत करने में सक्षम होंगे। – wilhelmtell
समस्या यह है कि किसी दिए गए उदाहरण के लिए कई "समाधान" हैं, और आप हमेशा सामान्यीकृत नहीं कर सकते हैं। हो सकता है कि यदि आपके पास कई अलग-अलग उदाहरणों का एक सेट था, तो सामान्यीकृत समाधान (वास्तव में केवल एक डिज़ाइन पैटर्न) को देखना उचित होगा – Tom