2011-02-08 16 views
15

मैं एक कार्य विशिष्ट .NET Plattform के साथ काम कर रहा हूं, जो precompiled है और ओपनसोर्स नहीं है। कुछ कार्यों के लिए मुझे इस वर्ग को विस्तारित करने की आवश्यकता है, लेकिन इससे विरासत में नहीं। मैं बस एक विधि जोड़ना चाहता हूँ।मैं टाइप पैरामीटर पर बाधाओं के साथ सामान्य प्रकार के लिए एक एक्सटेंशन विधि कैसे लिखूं?

पहले तो मैं तुम्हें एक dummycode मौजूदा वर्ग दिखाना चाहते हैं:

public static class MatrixExtension { 
    public static T getCalcResult<T>(this Matrix<T> mat) { 
     T result = 0; 
     ... 
     return result; 
    } 
} 

मैं कई गूगल से इस वाक्य रचना है:

public class Matrix<T> where T : new() { 
    ... 
    public T values[,]; 
    ... 
} 

मैं निम्नलिखित तरीके से इस वर्ग का विस्तार करना चाहते लिंक इसलिए कोई विचार नहीं कि यह सही है या नहीं। संकलक मुझे कोई त्रुटि नहीं बताता है, लेकिन अंत में यह काम नहीं करता है। अंत में मैं इस फ़ंक्शन को निम्न तरीके से कॉल करना चाहता हूं:

Matrix<int> m = new Matrix<int>(); 
... 
int aNumber = m.getCalcResult(); 

तो किसी को भी कोई विचार आया? आपके सहयोग के लिए धन्यवाद!

सादर Nem

+0

तुम्हें क्या लगता है यह काम नहीं करता हो? क्या यह अपवाद फेंकता है? –

+1

एक्सटेंशन विधि का उपयोग करने का यह सही तरीका है, लेकिन 'टी परिणाम = 0' के बजाय आपके पास' टी परिणाम = डिफ़ॉल्ट (टी) 'होना चाहिए क्योंकि टी प्रारंभ में 'int' तक सीमित नहीं है।इसके अलावा, आपको यह सुनिश्चित करने के लिए जांच करनी चाहिए कि आपके पास MatrixExtension क्लास को शामिल करने के लिए उपयोग कथन है। आप यह सुनिश्चित करने के लिए कि क्या यह काम कर रहा है, आप सीधे 'MatrixExtension.getCalcResult (m)' को कॉल करके जांच सकते हैं। –

+0

कम से कम आईडीई मुझे इस तरह की विधि को कॉल करने के लिए मजबूर करता है: m.getCalcResult (); लेकिन जब मैं इस संकलन करने की कोशिश मैं एक अन्य त्रुटि मिलती है: > 'मैट्रिक्स ' 'getValue' के लिए एक परिभाषा और कोई विस्तार विधि 'getValue' प्रकार का एक पहला तर्क को स्वीकार करने 'मैट्रिक्स ' शामिल नहीं है हो सकता है मिला (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) विधि को कॉल करने के इस तरीके से कोई अर्थ नहीं है क्योंकि जेनेरिक पैरामीटर टी पहले ही असाइन किया गया है। –

उत्तर

23

आपको एक्सटेंशन विधि पर समान प्रकार की पैरामीटर बाधाओं को जोड़ने की आवश्यकता है।

यह वह जगह है कि संकलित करता है तथा चलाता अपने उदाहरण के निकटतम पुनर्निर्माण पर मेरे प्रयास, किसी भी त्रुटि के बिना:

public class Matrix<T> where T : new() { 
    public T[,] values; 
} 


public static class MatrixExtension { 
    public static T getCalcResult<T>(this Matrix<T> mat) where T : new() { 
     T result = new T(); 
     return result; 
    } 
} 

class Program { 
    static void Main(string[] args) { 
     Matrix<int> m = new Matrix<int>(); 
     int aNumber = m.getCalcResult(); 
     Console.WriteLine(aNumber); //outputs "0" 
} 
+0

मैं अपना कोड पोस्ट करने पर विचार कर रहा था, लेकिन यह वही है। – Marlon

+0

क्या होता है यह देखने के लिए आप _my_ कोड को एक नई परियोजना में कॉपी/पेस्ट कर सकते हैं। –

+0

हाँ यह काम करता है! लेकिन अब मुझे पता है कि मैंने क्या देखा नहीं है! 'कक्षा मैट्रिक्स जहां टी: नया()' मैंने पूरी तरह से उस पर ध्यान नहीं दिया है। :( –

-2

आप "डेकोरेटर" में देखा है ...

Sample showing Decorator patterns

एक डेकोरेटर आप एक से एक प्रत्यक्ष व्युत्पत्ति कर के बिना अपने स्वयं के गुण और तरीकों के साथ एक वर्ग बनाने की अनुमति देता विशिष्ट वर्ग फिर, आप इसे किसी अन्य वस्तु पर "लागू" कर सकते हैं। फिर आप अपने अतिरिक्त तरीकों, या गुणों का उपयोग कर सकते हैं जिनके साथ आप काम करने की कोशिश कर रहे हैं।

यह नमूना अभी इस तरह के एक उदाहरण दिखा एक सरल त्वरित खोज अपने आप में संलग्न करने के लिए "कार" "विकल्प" का निर्माण करके ...

+1

यह वास्तव में उनके प्रश्न का उत्तर नहीं है। –

+0

@ जिम श्यूबर्ट, हाँ ... मुझे पता है ... जबकि मैं कुछ नमूने देखने की कोशिश कर रहा था, माउस टच पैड मारा गया होगा ... जब तक मैं समायोजित करने के लिए वापस नहीं आया ... – DRapp

+0

मैंने नीचे नहीं किया वोट, लेकिन मैं कहना चाहता था ... उन टचपैड सबमिशन मुझे हर बार मिलता है। इसके अलावा, +1 क्योंकि एक सजावटी समस्या को हल कर सकता है और एक व्यवहार्य उत्तर है। मेरी पहली टिप्पणी वास्तव में निर्देशित की गई थी कि उत्तर के मुकाबले एक टिप्पणी के लिए एक सिंगल-वाक्य प्रश्न बेहतर कैसे उपयुक्त होता है: \ –

2

था, केवल "त्रुटि" मैं देखना चाहते हैं यह है:

T result = 0; 

आप करने के लिए कि बदल सकता है:

T result = default(T); 

मूल्य प्रकार के मामले में, यह शून्य हो जाएगा, तो यह सुरक्षित होगा।

हालांकि, आपको यह पता चल जाएगा कि जब आप सूचीबद्ध "..." अनुभाग में जाते हैं तो यह मुश्किल होता है। मूल प्रकार (int, double, आदि) एक विधि को लागू न करें जिसका उपयोग आप अपने गणित की गणना के लिए कर सकते हैं। यह एक long time, very highly voted request on Connect है, बीटीडब्ल्यू।

कामकाज होने पर, वे जीवन को बहुत मुश्किल बनाते हैं। सी ++ में टेम्पलेट्स के विपरीत, सी # जेनिक्स वास्तव में मनमाना प्रकारों पर सुरक्षित गणितीय परिचालनों का समर्थन नहीं करते हैं।

+0

मुझे लगता है कि यह मेरी समस्या है जो रहेगी। लेकिन यह मेरा सवाल नहीं था। मेरा सवाल यह है कि इस सामान्य वर्ग को कैसे बढ़ाया जाए। एक अज्ञात वर्ग के लिए यह कोई समस्या नहीं है। –

+0

@nemcija: हाँ - लेकिन जेनेरिक क्लास को विस्तारित करना ठीक है जैसा आपने किया - यह कोई समस्या नहीं है। जब आप संकलक त्रुटि तय करते हैं तो यह वही है जिसे आप चलाने के लिए जा रहे हैं। –

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