2011-01-08 11 views
15

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

public interface IModule<T> where T : DataBean { ..... } 
public class Module<T> : IModule<T> where T : DataBean { .... } 

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

MSDN बस उपलब्ध कराई गई:

उपवर्ग का उपयोग करते समय सामान्य प्रकार पैरामीटर, आप दोहराना चाहिए किसी भी बाधाओं उपवर्ग स्तर पर आधार श्रेणी स्तर पर तय कर दी। उदाहरण, व्युत्पत्ति बाधा

के लिए क्यों यह संभव आधार वर्ग/इंटरफ़ेस से की कमी का अनुमान लगाने के नहीं है?

+1

बाधाओं की प्रतिलिपि बनाने की आवश्यकता नहीं है, आप बच्चे को अधिक विशिष्ट बनाने के लिए माता-पिता की बाधा प्रकार में परिवर्तनीय कुछ भी चुन सकते हैं। –

+0

सी # 4.0 spec बहुत कुछ वही बात कहता है (§13.4.3), लेकिन कोई कारण नहीं प्रदान करता है। – Oded

+0

क्या होगा यदि उप-वर्ग में मेरा सामान्य पैरामीटर बेस क्लास में जेनेरिक पैरामीटर में बाधाओं का खंडन कर रहा है? – Paul

उत्तर

6

मैं किसी भी कारण से नहीं आ सकता कि सी # सैद्धांतिक रूप से बाधाओं पर प्रतिलिपि नहीं कर सका। लेकिन हमें कॉपी (या वृद्धि) बनाने का दस्तावेजी व्यवहार स्पष्ट रूप से उपयोगिता के लिए सबसे आसान तरीका प्रतीत होता है।

public class A{} 
public class B : A {} 

public class X<T> where T: A {} 
public class Y<T> : X<T> where T: B { } 

ऊपर में, ध्यान दें, कि मैं Y<T> पर बाधा पर कॉपी explicty नहीं था क्योंकि एक Bहमेशा एक A है।

अब देखें कि क्या होता है यदि "कंपाइलर स्वचालित रूप से बाधाओं पर प्रतिलिपि बनाता है"। मान लें कि मैं बिना किसी बाधा के Y<T> परिभाषित करता हूं और संकलक उन्हें स्वचालित रूप से स्थानांतरित करता है। मैं बहुत सारे कोड में Y<T> का उपयोग करता हूं। फिर मैं कुछ नया इंटरफ़ेस शामिल करने के लिए X<T> की घोषणा पर बाधाओं को बदलता हूं।

X<T> की घोषणा को बदलने के लिए संकलक त्रुटियों साइटों जहाँ मैंY<T> का उपयोग पर कर रहे हैं!

सी # कंपाइलर वर्तमान में काम करता है जिस तरह से कंपाइलर त्रुटियां X<T> के उपयोग पर हैं, क्योंकि मैं उम्मीद करता हूं कि अगर मैं इसे एक ब्रेकिंग तरीके से बदलूं।

तो कुछ परिदृश्यों में यह सुविधाजनक होगा, लेकिन यह दूसरों में कुछ भ्रमित भी होगा। हालांकि दोनों वैध दृष्टिकोण हैं, मैं मानता हूं (ध्यान दें कि मैं सी # डिजाइन टीम के दिमाग को पढ़ने में सक्षम नहीं हूं) कि यह एक निर्णय कॉल था और पूरी तरह से तकनीकी नहीं था।

मैं कहता हूं "पूरी तरह से तकनीकी नहीं", लेकिन मैं निश्चित रूप से कुछ इंटरफ़ेस परिदृश्यों की कल्पना कर सकता हूं, जहां यह सत्यापित करने के लिए कुछ आसान होगा कि सभी बाधाओं को पूरा किया गया है, जो कि सभी आवश्यक विरासत बाधाओं को पूरा करने वाली सरल बाधा उत्पन्न करने के बजाय मिलते हैं।

5

मानक सी # टीम ज्ञान। घोषणा स्वयं दस्तावेज होना चाहिए। और सबसे अधिक, एक प्रकार की घोषणा में बदलाव को नैदानिक ​​उत्पन्न किए बिना किसी असंबंधित अन्य प्रकार के व्यवहार को परिवर्तित नहीं करना चाहिए। डिजाइन में डाले गए -100 अंक सिद्धांत एक और लेते हैं।

1

इंटरफ़ेस पर constranints संकलक को बताने के लिए बहुत कमजोर हैं कि मॉड्यूल क्लास में क्या बाधाएं होनी चाहिए। उदाहरण के लिए, मॉड्यूल क्लास को डेटाबीन के एक सुपर-क्लास (विरासत वर्ग) पर बाधा हो सकती है।

मुझे सी # डिजाइनरों के ज्ञान को नहीं पता। क्योंकि बाधाएं अलग-अलग हो सकती हैं, मुझे लगता है कि डेवलपर स्पष्ट रूप से संकलक को धारणा बनाने के बजाय बाधा घोषित करने का निर्णय लिया गया था।

संबंधित मुद्दे