2010-04-24 12 views
108

सी # में मेरे परीक्षण कोड:सी #: सार कक्षाओं को इंटरफेस को लागू करने की आवश्यकता है?

निम्नलिखित संकलक त्रुटि में
namespace DSnA 
{ 
    public abstract class Test : IComparable 
    { 

    } 
} 

परिणाम:

error CS0535: 'DSnA.Test' does not implement interface member 
'System.IComparable.CompareTo(object)' 

वर्ग Test के बाद से एक सार वर्ग है, क्यों संकलक यह आवश्यकता होती है इंटरफ़ेस को लागू करने ? कंक्रीट कक्षाओं के लिए यह आवश्यकता केवल अनिवार्य नहीं होनी चाहिए?

+0

हाहा। मैंने एक बात लिखी और फिर इसे बदलने का फैसला किया। माफ़ कीजिये। :) – Joel

+0

स्वीकार्य उत्तर पर डाउनवॉट्स और टिप्पणियों के आधार पर, मेरा मानना ​​है कि डाउनवॉट्स के सवाल के कारण आते हैं। ओपी पूछता है "यह इस तरह क्यों है", जो स्टैक ओवरफ्लो के दायरे से बाहर होगा। यह खुद का सामना करने के बाद, सवाल यह है कि "क्या मुझे कुछ याद आ रहा है? क्या मुझे वास्तव में कार्यान्वयन की आपूर्ति करनी है? क्या इससे यह एक अमूर्त वर्ग नहीं है?" जिस पर जवाब है "नहीं, आपको * कार्यान्वयन * (जो एक अमूर्त वर्ग के उद्देश्य का उल्लंघन नहीं करेगा) की आपूर्ति करने की ज़रूरत नहीं है, लेकिन यह है कि आपको अपनी स्थिति को काम करने के लिए क्या करना है।" – ToolmakerSteve

उत्तर

96

सी # में आप अभी भी विधियों को परिभाषित करते हैं, लेकिन आप शरीर प्रदान नहीं करते हैं और आप इसे सार के रूप में चिह्नित करते हैं। इसलिए जैसा:

interface IFoo 
{ 
    void Bar(); 
} 

abstract class Foo : IFoo 
{ 
    public abstract void Bar(); 
} 

या दूसरे शब्दों में कहें रहे हैं: करने की जरूरत नहीं आप करते "लागू" यह (जो सार वर्गों पर एक भयानक सीमा होगा); हालांकि, सी # में, आप को कंपाइलर बताना है कि आप जानबूझकर कंक्रीट उप-वर्गों में हिरण पारित कर रहे हैं - और कोड की उपरोक्त पंक्ति से पता चलता है कि ऐसा कैसे करें।

[टिप्पणियां और डाउनवॉट्स शिकायत करते हैं कि यह प्रश्न का उत्तर नहीं है, इस बिंदु को याद कर रहे हैं। कोई व्यक्ति इस कंपाइलर त्रुटि को प्राप्त करने के बाद, स्टैकओवरफ्लो में आ रहा है, लेकिन एक अमूर्त वर्ग जिसमें एक कार्यान्वयन की आपूर्ति करने की गलती होगी, एक अच्छे समाधान के बिना फंस गए हैं - रनटाइम अपवादों को फेंकने वाले कार्यान्वयन विधियों को लिखना होगा, एक भयानक काम- चारों ओर - जब तक वे उपरोक्त जानकारी नहीं है। क्या यह अच्छा है या बुरा है कि सी # इस मुखरता की आवश्यकता है stackoverflow के दायरे से बाहर है, और सवाल है और न ही इस उत्तर के लिए प्रासंगिक नहीं।]

+0

मैं एक समान उत्तर की तलाश में हूं लेकिन मेरे मामले में मेरे पास एक ही विधि नाम के साथ 2 इंटरफेस (उदा। IFoo1 और IFoo2) हैं और मुझे अपने आधार (सार) वर्ग में सार के रूप में चिह्नित करने में कुछ समस्याएं आ रही हैं। क्या आप मदद कर सकते हैं? – Ben

+0

यह समझाता नहीं है कि सार विरासतकर्ता को आधार 'अमूर्त सदस्यों को लागू करने की आवश्यकता क्यों नहीं है। – AgentFire

+2

@ बेन बस अपनी टिप्पणी देखी। आपने शायद इसे पहले से ही समझ लिया है, लेकिन अगर किसी और को इसकी आवश्यकता है। स्पष्ट इंटरफ़ेस कार्यान्वयन देखें: http://msdn.microsoft.com/en-us/library/ms173157.aspx – Joel

3

वे वास्तव में इंटरफ़ेस लागू करने के लिए नहीं है।
इंटरफ़ेस विधियों/गुणों को सार या यहां तक ​​कि आभासी भी हो सकता है। तो यह वास्तव में उन्हें लागू करने के लिए उपclasses तक।

7

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

https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx

+1

सुपर स्पष्ट उत्तर और बढ़िया है कि आप दोनों स्थितियों को प्रदान करते हैं, जैसे आप कभी-कभी बेस क्लास – VinKel

+0

में व्यवहार को लागू करना भी हो सकता है: यहां एक प्रश्न उठता है: क्यों इन सी # बॉयलरप्लेट घोषणाएं (जो स्पष्ट रूप से वे हैं) को सार वर्गों में मौजूद होने की आवश्यकता है, जो अन्यथा संक्षेप में और छोटे हो सकते हैं (इस प्रकार कक्षाओं को गड़बड़ाना)? मेरे सी # प्रोजेक्ट में मेरे पास बहुत सारे अमूर्त वर्ग और इंटरफेस हैं - और अधिकांश समय के लिए मैं क्या करता हूं, विजुअल स्टूडियो में विधियों की घोषणाओं को कॉपी और पेस्ट करना। – forsberg

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