2010-04-15 10 views
6

क्या इस तरह एक वाक्य रचना सी # में क्या मतलब है?इस तरह का वाक्यविन्यास सी # में क्या मतलब है?

public abstract class HostFactory<TApp> : ServiceHostFactory 
     where TApp : IFoo 
+2

आप कौन सा हिस्सा समझ नहीं सकते? –

+1

'.NET जेनेरिक' और 'जेनेरिक पैरामीटर पर बाधाएं' देखें – Gishu

उत्तर

2

एक बहुत यहाँ चल रहा है और मुझे आश्चर्य है कि अगर यह "IFoo" की वजह से होमवर्क है, या हो सकता है आपको लगता है कि प्रतिस्थापन उदाहरण सरल करने के लिए बनाया है।

- : ServiceHostFactory, HostFactory ServiceHostFactory से विरासत।

- के रूप में यह टैप का एक प्रकार पैरामीटर है HostFactory<TApp>, HostFactory एक सामान्य प्रकार है। जब भी कोई मेजबान फैक्टरी वर्ग का उपयोग करता है, तो वे TApp के लिए एक प्रकार निर्दिष्ट कर सकते हैं जो उस प्रकार का हर जगह उपयोग किया जाएगा TApp वह कोड कोड int दिखाई देता है। तो अगर वर्ग एक समारोह TApp GetApp() है और वे टैप के लिए <int> निर्दिष्ट करते हैं, तो GetApp वास्तव में int GetApp()

है - where TApp : IFoo, टैप IFoo इंटरफ़ेस को लागू करना चाहिए (यह एक वर्ग के रूप में अच्छी तरह से हो सकता था, यह दर्शाता है कि यह उस वर्ग से विरासत चाहिए , सीधे नहीं सीधे)।

- abstract, होस्टफैक्टरी एक सार वर्ग है, जिसका अर्थ है कि अन्य वर्ग इसका उत्तराधिकारी हो सकते हैं, लेकिन कोई कोड होस्टफैक्टरी को तुरंत चालू नहीं कर सकता है। यह मेरे जैसा आपको एक कार का फ्रेम दे रहा है, और कह रहा है, आपको कानूनी रूप से सड़क पर इसे चलाने की अनुमति नहीं है, लेकिन आपका स्वागत है कि आप इसे स्वयं से बाहर कर लें।

- public HostFactory जिसका अर्थ यह विधानसभा जिसमें यह घोषित किया गया था के बाहर कोड करने के लिए दिख रहा है, जनता है।

संपादित करें: जेनरिक पर अधिक मैं MSDN से एक बहुत महत्वपूर्ण उद्धरण के साथ शुरू होगा: "। जेनेरिक्स सी # 2.0 के सबसे शक्तिशाली विशेषता है"

जब आप ऐसा कुछ लिखते हैं जो आप कई प्रकार के साथ काम कर सकते हैं तो आप जेनेरिक का उपयोग करेंगे। उदाहरण के लिए, 2.0 में जेनेरिक होने से पहले, हमें इसे किसी ऑब्जेक्ट में ऑब्जेक्ट में डालना था, इससे पहले कि हम इसे एक संग्रह में रख सकें, जो वास्तव में खतरनाक था क्योंकि copmpiler यह सत्यापित नहीं कर सका कि जब भी आपको बाद में सही प्रकार कास्टिंग मिल रहा था संग्रह से बाहर एक आइटम। जेनिक्स के साथ हम बूल के ऐरेलिस्ट बनाने के लिए ArrayList<bool> कर सकते हैं और अब कलाकारों को डालने की कोई आवश्यकता नहीं है। संकलक यह सत्यापित कर सकता है कि हम संग्रह में बूल डाल रहे हैं।

उदाहरण के लिए, उपरोक्त वर्ग में हम एल्गोरिदम लिख सकते हैं जो IFoo को लागू करने वाली चीज़ों के साथ काम करते हैं, केवल यह जानकर कि ऑब्जेक्ट उन चीजों को करने में सक्षम होगा जो IFoo इंटरफ़ेस है। तो मैं एक एल्गोरिदम लिख सकता हूं जो IFoo इंटरफ़ेस पर विधियों को कॉल करता है, और फिर मेरे एल्गोरिदम को भविष्य में आईफू इंटरफ़ेस लागू करने वाले किसी भी व्यक्ति द्वारा पुन: उपयोग किया जा सकता है।

+0

होमवर्क नहीं :) –

+0

@ हम्म मैं आपका शब्द इस पर ले जाऊंगा। मैंने जवाब देने से पहले मैंने अतीत में पूछे गए अन्य प्रश्नों को देखा और ऐसा प्रतीत नहीं होता कि आप उस प्रकार के व्यक्ति थे :) – AaronLS

+0

असल में जेनेरिक मुझे भ्रमित कर रहे हैं, आप इनका उपयोग कब करेंगे आदि और यह वाक्यविन्यास नहीं था मुझसे परिचित (हालांकि औजारों पर मेरा अनुमान सही था, मैं इस बात का और अधिक जानना चाहता था कि आप इसका उपयोग कब करेंगे और कब करेंगे)। –

17

HostFactory एक सार्वजनिक सामान्य वर्ग (ServiceHostFactory से प्राप्त) एक भी सामान्य प्रकार तर्क TApp कहा जाता है, जहां किसी भी आपूर्ति की TAppIFoo इंटरफेस (चेतावनी को लागू करना चाहिए के साथ है: IWhatever पैटर्न महज एक सम्मेलन है, IFooसकता है एक वर्ग हो, मुझे लगता है)। प्रकार HostFactory<TApp> एक ठोस प्रकार नहीं है; इसे आगे instantiated जा करने के लिए subclassed किया जाना चाहिए - बातों से नीचे की तरह (हालांकि एक सामान्य उपवर्ग भी पर्याप्त होगा) शायद:

public class BarHostFactory : HostFactory<Bar> {} 
public class Bar : IFoo {...} 
+0

बहुत अच्छी स्पष्टीकरण। वोट दें! – Kaili

+0

मार्क समझाओ के लिए धन्यवाद! –

3

यह एक सार सामान्य वर्ग, उस पर एक बाधा के साथ ServiceHostFactory से विरासत है सामान्य प्रकार।

Constraints on Type Parameters (C# Programming Guide)

Inheritance (C# Programming Guide)

Generic Classes (C# Programming Guide)

+1

डारन ने मुझे मार दिया :) – Kaili

+0

धन्यवाद सर! ग्रेट लिंक :) –

2

इसे कहते हैं HostFactory एक सामान्य प्रकार TApp है और यह where कीवर्ड संकेत है कि TApp एक constrant है ServiceHostFactory से विरासत और कहा कि।

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

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

+2

(साइड नोट: 'जहां किसी विशेष इंटरफ़ेस को लागू करता है "की तुलना में सामान्य बाधा में अन्य अर्थ हैं - कम से कम 4 अन्य उपयोग (': struct', ': class',': new() ' , ': SomeBaseType') –

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