से जेनेरिक विधि/प्रतिनिधि को आमंत्रित करना मुझे लगता है कि मैं इस मुद्दे को दाहिने कोण से नहीं देख रहा हूं, और मैं बस अन्य समाधान की सोच नहीं रहा हूं।गैर-जेनेरिक बेस क्लास
इस सामान्य वर्ग को मानना;
public abstract class Port<T>
{
public delegate T PullDelegate();
private PullDelegate pull;
public Port(PullDelegate pull)
{
this.pull = pull;
}
public T Pull()
{
return pull();
}
}
इसका उपयोग ग्राफ-नोड संपादक में "बंदरगाह" को परिभाषित करने के लिए किया जाता है। एक बंदरगाह एक ऑब्जेक्ट/वैल्यू को एक नोड से दूसरे में स्थानांतरित कर सकता है, लेकिन उन्हें "टाइप-सेफ" भी होना चाहिए, जिसका अर्थ है कि मैं किसी भी बंदरगाह को गलत प्रकार के किसी अन्य प्लग पर प्लग नहीं कर सकता (कम से कम कुछ रूपांतरण के बिना नहीं)।
नोड एक बंदरगाह का मालिक है और इसे अपनी विधि में से एक प्रतिनिधि को देता है ताकि जब कोई अन्य नोड एक मूल्य पर "खींचें", तो पोर्ट बस इसे आमंत्रित करता है और उचित मूल्य देता है।
मेरी समस्या तब शुरू होती है जब मैं गैर-जेनेरिक संग्रह से Pull()
पर कॉल करने का प्रयास कर रहा हूं। जाहिर है, मैं एक गैर-सामान्य आधार विधि बना सकता हूं, लेकिन फिर पुल T
वापस नहीं कर सका, इसे object
वापस करने की आवश्यकता होगी।
इसके अलावा, प्रत्येक नोड्स में उनके बंदरगाहों के लिए संग्रह एक्सेसर्स होते हैं ताकि अन्य आइटम उन्हें प्राप्त कर सकें। वह संग्रह गैर-सामान्य होना चाहिए क्योंकि नोड में कई प्रकार के कई बंदरगाह हो सकते हैं।
public abstract Port[] Inputs { get; }
public abstract Port[] Outputs { get; }
public abstract Port[] Entries { get; }
public abstract Port[] Exits { get; }
जिस क्षण गैर-सामान्य प्रकार खेल में आता है, सबकुछ सामान्य हो जाता है। अगर केवल Port<>[]
एक बात होगी।
मैं की तरह मैं कुछ याद कर रहा हूँ महसूस कर रहा हूँ ...
आप 'आईपोर्ट {टी पुल() बना सकते हैं; } 'फिर एक' IENumerable > 'बनाएँ। –
Lee
आपकी ऑब्जेक्ट्स के बारे में क्या होगा, सभी एक इंटरफ़ेस को लागू करेंगे ताकि आप सुनिश्चित हो सकें कि यह कम से कम होगा और उस उपकरण को ऑब्जेक्ट करेगा, क्या इससे आपकी स्थिति बदल जाएगी? तो आप वस्तुओं का उपयोग करने से बच सकते हैं, बल्कि IMyObject की तरह कुछ। –
'पोर्ट' 'पोर्ट' बेस क्लास है? आप गैर जेनेरिक संग्रह का उपयोग कैसे करना चाहते हैं? –