2011-02-01 22 views
10

मैं एक सार विधि के साथ एक अमूर्त वर्ग लिख रहा हूँ निर्दिष्ट किए बिना एक सार विधि को परिभाषित करें (इस प्रकार, सभी वर्गों यह से इनहेरिट कि विधि को लागू करना चाहिए)। हालांकि, मैं पैरामीटर निर्दिष्ट नहीं करना चाहता हूं जो विधि का उपयोग करना चाहिए, क्योंकि प्रत्येक विधि अलग-अलग या कोई पैरामीटर नहीं ले सकती है। केवल नाम और वापसी मूल्य समान होना चाहिए।मापदंडों

क्या सी # में ऐसा करने का कोई तरीका है?

किसी भी मदद के लिए धन्यवाद!

उत्तर

16

नहीं, और ऐसा करने के लिए व्यर्थ होगा। यदि आपने पैरामीटर घोषित नहीं किया है, तो आप केवल बेस क्लास के संदर्भ को दिए गए विधि को कॉल करने में सक्षम नहीं होंगे। यह अमूर्त तरीकों का मुद्दा है: कॉलर्स को ठोस कार्यान्वयन की परवाह नहीं करने की अनुमति देने के लिए, लेकिन उन्हें उपयोग करने के लिए एक एपीआई देने के लिए।

फोन करने वाले सटीक तरीका हस्ताक्षर के लिए ज़रूरी है, तो आप एक ठोस कार्यान्वयन के लिए है कि फोन करने वाले संबद्ध किए गए, अमूर्त अनिवार्य रूप से बेकार बना रही है।

शायद अगर आप अधिक विवरण दे सकता है, तो हम अधिक उपयुक्त तरीका सुझाव है कि सकता है?

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

कंक्रीट उपप्रकार या तो भी सामान्य हो सकता है, या उदाहरण के लिए Foo<string> से निकाले जाते हैं: उदाहरण के लिए, आप प्रकार सामान्य बनाने के लिए सक्षम हो सकता है।

+0

प्रत्येक बच्चे को इस विधि का कार्यान्वयन करना होगा जहां यह विभिन्न प्रकार के इनपुट ले सकता है, लेकिन उसी प्रकार के आउटपुट का उत्पादन करेगा। इस प्रकार मैं अपने प्रोग्राम के तर्क को करने के लिए आउटपुट का उपयोग कर सकता हूं। – TheBoss

+2

@TheBoss: अमूर्त वर्गों (जैसे इंटरफेस) का बिंदु सामान्य कार्यक्षमता के एक..वेल..ब्रास्ट्रक्शन की अनुमति देना है। आप इसका उपयोग कुछ ऐसा परिभाषित करने के लिए नहीं कर सकते जैसे "आपको 'फू' नामक फ़ंक्शन की आवश्यकता है जो * कुछ * (या नहीं) पैरामीटर लेता है और 'int'' देता है; इस तरह के एक समारोह को सारणित नहीं किया जा सकता है, क्योंकि इसका हस्ताक्षर अनिर्धारित है। कोड से (गैर-प्रतिबिंबित) कॉल करना असंभव होगा जो वर्ग को उच्च स्तर पर संदर्भित करता है, जहां विशिष्ट हस्ताक्षर परिभाषित किया गया है, अबास्ट्रक्शन को तोड़ना। –

+0

@TheBoss: मुझे लगता है कि आपको अपनी डिज़ाइन चुनौती को हल करने के लिए जेनेरिक का उपयोग करना चाहिए - जैसे कोड पोस्ट किए गए कोड उदाहरण की तरह। – code4life

0

नहीं, ऐसा नहीं है।

एक विधि ओवरराइड करने के लिए, आप विधि हस्ताक्षर से मेल खाना चाहिए। इसमें विधि का नाम और प्रारूप पैरामीटर शामिल हैं।

2

नहीं। आपको इसकी आवश्यकता क्यों है? शायद Command Design Pattern यहां सहायता कर सकता है।

1

जो आप करने की कोशिश कर रहे हैं वह एक कोड गंध है।

एक बेहतर पैटर्न आपके अमूर्त वर्ग को ISupportInitialize लागू करना होगा, और उसके बाद एक सार Act() विधि होनी चाहिए।

विचार है कि करने के लिए कॉल के बीच में BeginInit और EndInit है जब आपका बच्चा प्रकार कार्य करने के लिए तैयार करते हैं, की जानकारी के विभिन्न बिट्स आप यादृच्छिक प्रकार और तर्कों की संख्या में रटना की कोशिश कर रहे सभा है। एक बार कॉन्फ़िगर हो जाने पर, और EndInit को कॉल किया जाता है (यहां मान्य करें) सार Act() कहा जा सकता है।

इसके अलावा, कृपया ऐसा नहीं करते हैं तो कृपया:

public abstract void Act(params object[] arguments); 

लोगों को आप शिकार होगा यदि आप कुछ इस तरह से करते हैं।

+0

यह एक दिलचस्प दृष्टिकोण है। तो मेरे पास कक्षा में एक बूलियन क्षेत्र होगा जो प्रारंभिकरण पूरा होने पर इंगित करेगा, और केवल तभी अधिनियम() विधि सफलतापूर्वक निष्पादित करेगी अन्यथा यह अपवाद फेंक देगा? – TheBoss

+0

@TheBoss मानक तकनीक एंडइनिट पर उदाहरण की स्थिति को सत्यापित करने और सही स्थिति में नहीं होने पर फेंकना है। इस इंटरफेस को लागू करने वाले प्रकार अक्सर एंडइनिट को कॉल करने के बाद खुद को अपरिवर्तनीय बनाते हैं। – Will

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