2013-03-22 7 views
13

चलो कहते हैं कि मैं एक सामान्य वर्ग के रूप में इस करते हैं:वाइल्डकार्ड बराबर

public class GeneralPropertyMap<T> 
{ 
} 

कुछ अन्य वर्ग में मैं एक विधि है कि GeneralPropertyMap<T> की एक सरणी में लेता है।

private void TakeGeneralPropertyMap(GeneralPropertyMap<?>[] maps) 
{ 
} 

हम वाइल्डकार्ड का उपयोग इतना है कि बाद में हम TakeGeneralPropertyMap के लिए किसी भी प्रकार से GeneralPropertyMap का एक समूह गुजर कॉल कर सकते हैं: जावा में, क्रम में एक सरणी है कि विधि इस प्रकार दिखाई देगा GeneralPropertyMap किसी भी प्रकार का होता है में लेने के लिए T प्रत्येक, इस तरह:

GeneralPropertyMap<?>[] maps = new GeneralPropertyMap<?>[3]; 
maps[0] = new GeneralPropertyMap<String>(); 
maps[1] = new GeneralPropertyMap<Integer>(); 
maps[2] = new GeneralPropertyMap<Double>(); 
//And finally pass the array in. 
TakeGeneralPropertyMap(maps); 

मुझे कोई सफलता के साथ सी # में एक बराबर यह पता लगाने की कोशिश कर रहा हूँ। कोई विचार?

+0

आप बनाने की कोशिश की समारोह ले लो 'GeneralPropertyMap [] maps' .. मुझे लगता है कि यह सहप्रसरण – Ankur

उत्तर

3

सी # में इसका कोई प्रत्यक्ष समतुल्य नहीं है।

सी # में, यह अक्सर अपने सामान्य वर्ग एक गैर सामान्य इंटरफ़ेस या आधार वर्ग को लागू होने के द्वारा किया जा जाएगा:

IPropertyMap[] maps = new IPropertyMap[3]; 
// ... 

TakePropertyMap(maps); 
+0

@EricJ की वजह से काम करना चाहिए। इस मुद्दे को गलत तरीके से पढ़ा गया था ... तय –

+0

मैं जेनेरिक तरीकों को समझता हूं, लेकिन वे इस मामले में नहीं करेंगे।हर बार जब मैं इसे कॉल करता हूं, तो मैं केवल जनरलप्रॉपर्टीमैप के लिए एक प्रकार निर्दिष्ट कर सकता हूं। तो मैं इसे केवल जनरलप्रॉपर्टीमैप [], या जनरलप्रॉपर्टीमैप , और इसी तरह की एक सरणी को पास कर सकता हूं। – AxiomaticNexus

15

:

interface IPropertyMap 
{ 
    // Shared properties 
} 

public class GeneralPropertyMap<T> : IPropertyMap 
{ 
} 

फिर आप इन की एक सरणी गुजारें सकता सी # में जेनिक्स जावा में जेनरिक की तुलना में मजबूत गारंटी देता है। इसलिए, सी # में जो करना चाहते हैं, उसे करने के लिए आपको GeneralPropertyMap<T> कक्षा को उस वर्ग (या इंटरफ़ेस) के गैर-सामान्य संस्करण से प्राप्त करना होगा।

public class GeneralPropertyMap<T> : GeneralPropertyMap 
{ 
} 

public class GeneralPropertyMap 
{ 
    // Only you can implement it: 
    internal GeneralPropertyMap() { } 
} 

अब आप कर सकते हैं:

private void TakeGeneralPropertyMap(GeneralPropertyMap[] maps) 
{ 
} 

और:

GeneralPropertyMap[] maps = new GeneralPropertyMap[3]; 
maps[0] = new GeneralPropertyMap<String>(); 
maps[1] = new GeneralPropertyMap<Integer>(); 
maps[2] = new GeneralPropertyMap<Double>(); 
TakeGeneralPropertyMap(maps); 
+1

यह अभी भी पर्याप्त नहीं है क्योंकि इंटरफ़ेस में आप संभवतः "TakeGeneralPropertyMap" विधि से उपयोग करने के लिए वाइल्डकार्ड लौटने या ले जाने की विधि चाहते हैं, जिसे आप नहीं कर सकते क्योंकि हम नहीं चाहते कि इंटरफ़ेस होना चाहिए एक सामान्य प्रकार का। हालांकि, यह जवाब कम से कम बंद हो जाता है। धन्यवाद :-) – AxiomaticNexus

0

GeneralPropertyMap (IGeneralPropertyMap) के सदस्यों से एक इंटरफेस है, और फिर एक IGeneralPropertyMap[] एक तर्क के रूप ले लो।

8

जबकि, जैसा कि अन्य ने ध्यान दिया है, सी # में वाइल्डकार्ड के लिए कोई सटीक पत्राचार नहीं है, उनके कुछ उपयोग मामलों को covariance/contravariance के साथ कवर किया जा सकता है।

public interface IGeneralPropertyMap<out T> {} // a class can't be covariant, so 
             // we need to introduce an interface... 

public class GeneralPropertyMap<T> : IGeneralPropertyMap<T> {} // .. and have our class 
                  // inherit from it 

//now our method becomes something like 
private void TakeGeneralPropertyMap<T>(IList<IGeneralPropertyMap<T>> maps){} 

// and you can do 
    var maps = new List<IGeneralPropertyMap<Object>> { 
     new GeneralPropertyMap<String>(), 
     new GeneralPropertyMap<Regex>() 
    }; 
    //And finally pass the array in. 
    TakeGeneralPropertyMap<Object>(maps); 

चेतावनी है कि आप संकलन समय पर तो एक नया GeneralPropertyMap<int>() हमारे सूची में जोड़ने से मूल्य प्रकार के साथ सहप्रसरण उपयोग नहीं कर सकते, विफल रहता है।

cannot convert from 'GeneralPropertyMap<int>' to 'IGeneralPropertyMap<object>' 

यह दृष्टिकोण मामले में अपनी कक्षाओं/इंटरफेस के एक गैर जेनेरिक वर्जन आप प्रकार है कि GeneralPropertyMap शामिल कर सकते हैं विवश करना चाहते हैं की तुलना में और अधिक सुविधाजनक हो सकता है। उस मामले में:

public interface IMyType {} 
public class A : IMyType {} 
public class B : IMyType {} 
public class C : IMyType {} 

public interface IGeneralPropertyMap<out T> where T : IMyType {} 

की अनुमति देता है आप के लिए:

var maps = new List<IGeneralPropertyMap<IMyType>> { 
    new GeneralPropertyMap<A>(), 
    new GeneralPropertyMap<B>() , 
    new GeneralPropertyMap<C>() 
}; 
TakeGeneralPropertyMap(maps); 
संबंधित मुद्दे