अस्पष्ट शीर्षक के लिए खेद है, लेकिन मुझे यकीन नहीं था कि इसे एक वाक्यांश में सारांशित कैसे किया जाए। मेरे पास बहुत अनावश्यक सी # कोड के साथ एक स्थिति है, और यह वास्तव में विरासत या जेनेरिक की कुछ संपत्ति का उपयोग करके किसी तरह की चालाक चाल की तरह दिखता है। हालांकि, मैं एक बहुत अनुभवी प्रोग्रामर नहीं हूं (विशेष रूप से सी # के साथ) और बस समाधान को काफी नहीं देख सकता।विरासत या जेनेरिक के माध्यम से अनावश्यक कोड से छुटकारा पाने में परेशानी होने के कारण
स्थिति, सरलीकृत रूप में, इस तरह कुछ दिखता है। मेरे पास कक्षाओं का एक गुच्छा है जो सभी एक प्रकार से प्राप्त होते हैं।
public class Foo : SuperFoo
{
...
public Foo SomeMethod() { ... }
}
public class Bar : SuperFoo
{
...
public Bar SomeMethod() { ... }
}
public class Baz : SuperFoo
{
...
public Baz SomeMethod() { ... }
}
...
public class SuperFoo
{
...
}
समस्या आता है जब इन वस्तुओं के संग्रह संसाधित करने की आवश्यकता। मेरा पहला-ड्राफ्ट समाधान (बुरा) इस तरह दिखता है:
public void SomeEventHasHappened(...)
{
ProcessFoos();
ProcessBars();
ProcessBazes();
...
}
public void ProcessFoos()
{
...
foreach (var foo in fooList)
{
...
foo.SomeMethod();
}
}
public void ProcessBars()
{
...
foreach (var bar in barList)
{
...
bar.SomeMethod();
}
}
... और इतने पर। समस्या यह है कि मूल रूप से ProcessX विधियों में से सभी कोड समान वस्तुओं के प्रकार के अलावा समान होते हैं। स्पष्ट कारणों से इन सभी को एक विधि में समेकित करना अच्छा होगा।
मेरा पहला विचार केवल एक सामान्य प्रक्रिया() विधि बनाना था जिसने पैरामीटर के रूप में List<SuperFoo>
लिया और बस वहां से आगे बढ़ें। समस्या यह है कि एक सामान्य सुपरफू में कोई विधि नहीं है(), और इसमें कोई नहीं हो सकता है क्योंकि प्रत्येक बच्चे वर्ग 'SomeMethod() में एक अलग रिटर्न प्रकार होता है, इसलिए ओवरराइड काम नहीं करते हैं।
मैंने कोड देखा है जहां 'ऑब्जेक्ट' लौटाया गया है, और फिर उपयुक्त प्रकार पर डाला गया है। –
हालांकि समस्या को हल करने के रूप में मैंने इसे यहां प्रस्तुत किया है, मुझे स्पष्ट करना चाहिए ... मैं पसंद करता हूं कि 'SomeMethod()' सामान्य 'ऑब्जेक्ट' वापस न करें, क्योंकि 'SomeMethod()' को भी कॉल किया जाता है कोड के इस हिस्से के अलावा कई अन्य स्थानों, और उन सभी अन्य स्थानों में कास्टिंग की आवश्यकता होगी। फिर भी सुझाव के लिए धन्यवाद। – jloubert