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


131

C # में मेरा परीक्षण कोड:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

निम्नलिखित संकलक त्रुटि में परिणाम:

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

चूँकि वर्ग Testएक अमूर्त वर्ग है , इसलिए इंटरफ़ेस को लागू करने के लिए कंपाइलर की आवश्यकता क्यों होती है? क्या यह आवश्यकता केवल ठोस वर्गों के लिए अनिवार्य नहीं होनी चाहिए ?


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

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

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

मेरी पिछली टिप्पणी को अनदेखा करें - यह अपेक्षा के अनुरूप काम नहीं किया, कम से कम आश्चर्य का सिद्धांत यहां लागू नहीं होता है।
पॉल मैकार्थी

जवाबों:


141

C # में, एक वर्ग जो एक इंटरफ़ेस को लागू करता है , उस इंटरफ़ेस के सभी सदस्यों को परिभाषित करने के लिए आवश्यक है। एक अमूर्त वर्ग के मामले में, आप बस उन सदस्यों को abstractकीवर्ड से परिभाषित करते हैं :

interface IFoo
{
    void Bar();
}

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

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

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


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

2
@Joel @ मुझे नहीं लगता कि स्पष्ट इंटरफेस अमूर्त वर्गों के साथ काम कर सकते हैं। ऊपर के उदाहरण कोड में, में परिभाषा बदलने Fooके लिए public abstract void IFoo.Bar();और आप शिकायतों कि "सार्वजनिक" और "सार" वैध संशोधक नहीं हैं मिलता है।
डैरेन कुक

8
यह इस सवाल का जवाब नहीं देता है कि यह बिल्कुल भी आवश्यक क्यों है, इस पर विचार करना एक अमूर्त वर्ग है और कंपाइलर को पता होना चाहिए कि रिक्त स्थान को कैसे भरना है। जावा में यह आवश्यक नहीं है, जो कई उपयोगी पैटर्न के लिए अनुमति देता है जैसे कि डेकोर कंटेनर पर डेकोरेटर पैटर्न जैसे स्प्रिंग / जावाईई (जब आपको किसी प्रबंधित इंटरफ़ेस की एक विशेष विधि को सजाने की आवश्यकता होती है)। एक ही कार्यान्वयन in.net बहुत वर्बोज़ विशेष रूप से इस तरह के nhibernate के ISession में बड़ा इंटरफेस पर होना करने के लिए डेवलपर्स के लिए मजबूर करने के लिए होता है
Sheepy

1
AspectJ के मिश्रण एक और उदाहरण है। यह आपको कई अमूर्त वर्गों से एकल इंटरफ़ेस में आंशिक कार्यान्वयन का मिश्रण करने की अनुमति देता है। प्रत्येक अमूर्त वर्ग को केवल उस विधि को लागू करने की आवश्यकता है जिसे वह लागू करना चाहता है। कोई डंब एब्सट्रैक्ट विधि बॉयलरप्लेट जिस तरह से हो रही है, वैसा ही अगर मैं इन कार्यक्षमता में एक ही कार्यक्षमता को पुनः बनाने के लिए कर रहा हूँ
भेड़ का आदमी

1
@ शेफी - सच है, लेकिन, IMHO, आपको गलतफहमी है कि पूछने वाले को क्या चाहिए , और यह वास्तव में एक "उत्तर" कैसे है। इसी तरह मेरा एक ही सवाल था - क्योंकि इसे लागू करने के लिए जरूरी होने का कोई मतलब नहीं था, इसलिए मैं फंस गया था। इसका उत्तर है: आपको इसे " कार्यान्वित " करने की आवश्यकता नहीं है - लेकिन यहां आपको संकलक को यह बताने के लिए क्या करना है कि आप इसे लागू नहीं करने जा रहे हैं। (यह सवाल कि आप [सही ढंग से कहते हैं] यह एक उत्तर नहीं है, एक उपयुक्त स्टैकओवरफ्लो प्रश्न नहीं होगा - इसे बस ऑफ-उद्देश्य के रूप में बंद कर दिया गया होगा।)
टूलमेकरसैट

10

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

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


1
सुपर स्पष्ट उत्तर और महान जो आप दोनों स्थितियों को प्रदान करते हैं, जैसा कि आप भी कभी-कभी बेस क्लास में व्यवहार को लागू करना चाहते हैं
विनकेल

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

5

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.