2016-01-12 10 views
5

से जेनेरिक विधि/प्रतिनिधि को आमंत्रित करना मुझे लगता है कि मैं इस मुद्दे को दाहिने कोण से नहीं देख रहा हूं, और मैं बस अन्य समाधान की सोच नहीं रहा हूं।गैर-जेनेरिक बेस क्लास

इस सामान्य वर्ग को मानना;

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<>[] एक बात होगी।

मैं की तरह मैं कुछ याद कर रहा हूँ महसूस कर रहा हूँ ...

+1

आप 'आईपोर्ट {टी पुल() बना सकते हैं; } 'फिर एक' IENumerable > 'बनाएँ। – Lee

+0

आपकी ऑब्जेक्ट्स के बारे में क्या होगा, सभी एक इंटरफ़ेस को लागू करेंगे ताकि आप सुनिश्चित हो सकें कि यह कम से कम होगा और उस उपकरण को ऑब्जेक्ट करेगा, क्या इससे आपकी स्थिति बदल जाएगी? तो आप वस्तुओं का उपयोग करने से बच सकते हैं, बल्कि IMyObject की तरह कुछ। –

+0

'पोर्ट ' 'पोर्ट' बेस क्लास है? आप गैर जेनेरिक संग्रह का उपयोग कैसे करना चाहते हैं? –

उत्तर

1

Port<T> गैर सामान्य इंटरफ़ेस IPort लागू स्पष्ट कार्यान्वयन का उपयोग कर सुनिश्चित करें। इस तरह यह एपीआई से छिपा हुआ है लेकिन फिर भी आपको सामान्य वर्गों में विधियों का आह्वान करने की अनुमति देता है।

public interface IPort 
{ 
    object SomeAction(object data); 
} 

public class Port<T> : IPort 
{ 
    //[.. all other methods ..] 


    object IPort.SomeAction(object data) 
    { 
     var typedData = (T)data; 
     //invoke our typed version. 
     return SomeAction(data); 
    } 

    public T SomeAction(T data) 
    { 
     // ... 
    } 
} 
+0

यदि मेरी समस्या बस कुछ पास करने के लिए थी, तो मैं जेनेरिक से परेशान नहीं होता। मेरे पास यह मुद्दा है कि मुझे इससे कुछ मिल रहा है। अपना 'कुछ एक्शन' रिटर्न 'टी' मान लें। – LightStriker

+0

@ लाइटस्ट्राइकर: आईपोर्ट से ऑब्जेक्ट लौटने के बारे में क्या। सोमैक्शन और टी आईपोर्ट से। सोमैक्शन (आईपीओआर आईपीओटी लागू करने के साथ)? मुझे लगता है कि वे IENumerable/IEnumerable में क्या करते हैं। – devstruck

+0

@ लाइटस्ट्राइकर: आपका मतलब अद्यतन उत्तर की तरह है? – jgauffin