2013-01-02 16 views
7

यह वास्तव में कुछ आसान है, मुझे यकीन है, लेकिन मैं इंटरफेसिंग की बात करते समय विरासत के आसपास अपने सिर को पाने के लिए संघर्ष कर रहा हूं।सी # जेनेरिक विधि विरासत और इंटरफ़ेस

निम्नलिखित कक्षाओं को देखते हुए, मैं आधार विधि को ओवरराइड किए बिना कक्षा अभिभावक के लिए विशिष्ट इंटरफ़ेस में गेट विधि को कैसे इंटरफ़ेस कर सकता हूं?

public class Base<T, T2> 
{ 
    public T Get<T, T2>(string key) 
    { 
     ... 
    } 
} 

public class Parent : Base<Type1, Type2>, IParent 
{ 
    ... 
} 

यहाँ है कि मैं क्या एटीएम है है, लेकिन मैं एक "inteface सदस्य टाइप 1 IParent.Get (स्ट्रिंग) लागू नहीं है" हो रही त्रुटि रहते हैं।

public interface IParent 
{ 
    Type1 Get(string key); 
} 
+1

यदि आपको पहले ही कक्षा में घोषित किया गया है तो आपको विधि में '' प्राप्त करने की आवश्यकता नहीं है। – ja72

+0

सभी टिप्पणियों के लिए धन्यवाद, इससे मुझे इसे बेहतर समझने में मदद मिली है।ja72, Krizz, चार्ल्स और गुवाँटे सभी ने सिर पर नाखून मारा, लेकिन चार्ल्स का विवरण सबसे गहराई से था (कोड उदाहरणों के साथ, कम नहीं) तो वह हरे रंग की टिक प्राप्त करता है :) – beterthanlife

उत्तर

2

Base<T,T2> की T Get<T,T2>(string) विधि और IParent की विधि Type1 Get(string) विधि दो अलग-अलग विधि हस्ताक्षर कर रहे हैं। आपको दोनों को लागू करने की आवश्यकता होगी। आप एक ही कार्यक्षमता का उपयोग करने के लिए दोनों कार्यान्वयन चाहता है तो तुम कर सकते हो निम्नलिखित:

public class ParentJ : Base<Type1, Type2>, IParent { 
public Type1 Get(string key) { 
    return this.Get<Type1,Type2>(key); 
} 
} 

हालांकि मेरा मानना ​​है कि अपने मूल उद्देश्य Base<T,T2> में Get() विधि parameterize करने के लिए नहीं है इसलिए तुम इतनी तरह Base लिखना होगा:

public class Base<T,T2> { 
    public T Get(string key) { 
    // implementation here 
    } 
} 

यह हस्ताक्षर IParent में विधि हस्ताक्षर को पूरा करेगा।

आपको विधिओं में केवल वर्ग पैरामीटर (उदा। T और T2) की आवश्यकता होती है, जब विधि उस विधि में कक्षा द्वारा अनुमानित नहीं किया जा सकता है या नहीं किया जाना चाहिए।

5

public T Get<T, T2>(string key) सामान्य वर्ग पर एक सामान्य विधि का निर्माण करेगा। T और T2 इस सामान्य विधि के तर्क होंगे और कक्षा के T और T2 से कोई संबंध नहीं होगा।

बस इसे public T Get(string key) बनाएं।

2

मिलान विधियों के साथ, यह हस्ताक्षर बिल्कुल मेल खाना चाहिए। हस्ताक्षर के घटकों में से एक सामान्य तर्कों की संख्या है।

आपके IParent इंटरफ़ेस में शून्य प्रकार के तर्कों के साथ एक विधि Get है। आपके Base कक्षा में दो प्रकार के तर्कों के साथ एक विधि Get है।

ऐसा लगता है कि Base.Get अपने प्रकार के तर्क साझा करता है, ऐसा नहीं है, सिंटैक्स का उपयोग दो नए प्रकार के तर्क बनाता है जो वर्ग के प्रकार तर्कों को छाया करते हैं।

फिक्स विधि को Parent में विधि को लागू करने के लिए है जिसमें कोई भी प्रकार का तर्क नहीं है।

1

इसे आजमाएं। आप आधार Get को ओवरराइड नहीं करते हैं और आप IParent लागू करते हैं। सामान्य IParent इंटरफ़ेस का उपयोग करके

public class Type1 { } 
public class Type2 { } 

public interface IParent 
{ 
    Type1 Get(string key); 
} 

public class Base<T, T2> 
{ 
    public T Get(string key) 
    { 
     return default(T); 
    } 
} 
public class Parent : Base<Type1, Type2>, IParent 
{ 
} 
संबंधित मुद्दे