2012-03-27 11 views
15
public sealed interface IMyInterface 
{ 
} 

देता है "संशोधित 'सील' इस आइटम के लिए मान्य नहीं है"इंटरफेस को सीलबंद के रूप में चिह्नित करने में सक्षम क्यों नहीं हैं?

मैं कुछ तरीके कि एक अंतरफलक descendable अन्यथा वर्ग इसे लागू नहीं कर सकते होना चाहिए में समझ सकते हैं।

लेकिन मैं यह निर्दिष्ट क्यों नहीं कर सकता कि एक इंटरफ़ेस में उप इंटरफ़ेस परिभाषित नहीं होना चाहिए या कोई तरीका नहीं है, बस sealed के साथ नहीं?

संपादित

मैं समझाने के लिए कारण है कि मैं इस चाहेगा कुछ प्रयास किया जाना चाहिए था। मैं अक्सर इंटरफ़ेस विरासत श्रृंखला देखता हूं जहां देव को इसके बजाय संरचना का उपयोग करना चाहिए। मुहरबंद कक्षाओं में इसके लिए आदर्श है और मुझे आश्चर्य हुआ कि इंटरफेस के लिए इसे लागू करने का कोई तरीका था या नहीं। चूंकि अनैतिक उत्तराधिकारी मेरी राय में दोबारा प्रतिक्रिया और रखरखाव करना कठिन बनाता है।

संपादित 2

टिप्पणियों और पोस्ट का प्रतिबिंब पर, इंटरफ़ेस inheritence पेड़ वस्तु inheritence पेड़ के रूप में परिसर के रूप के पास कहीं भी नहीं हो सकता। जब आप किसी अन्य इंटरफ़ेस IX से प्राप्त कर रहे हैं, तो आप कह रहे हैं कि "IX भी लागू करना चाहिए"। और इसे रोकने से कोई फायदा नहीं होता है।

+0

आप इसका क्या उपयोग करेंगे? आपका मतलब है कि आप एक मुहरबंद इंटरफ़ेस से विरासत में सक्षम होने की उम्मीद करेंगे, लेकिन विरासत वर्ग नए सदस्य कार्यों को बनाने में सक्षम होने के बिना? या कुछ और? –

+1

@Mrlister: इंटरफ़ेस से प्राप्त * इंटरफेस * को रोकने के लिए, केवल एकमात्र संभावित अर्थ जो मैं सोच सकता हूं, कुछ समझ सकता है। –

+0

चूंकि यह पहली बार हुआ है कि मैंने कभी यह प्रश्न पॉप अप किया है, मुझे उम्मीद है कि किसी को भी इस सुविधा की आवश्यकता नहीं है, और यह तुरंत आपके प्रश्न का उत्तर देता है: किसी ने भी इस सुविधा को लागू नहीं किया है, क्योंकि किसी को भी इसकी आवश्यकता नहीं है :-) – Steven

उत्तर

18

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

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

+0

इंटरफ़ेस विरासत श्रृंखला सीमित करके रिफैक्टरिंग और रखरखाव के लिए कोई लागत लाभ नहीं होगा? – weston

+0

@ वेस्टर्न: मुझे किसी के बारे में पता नहीं है। यदि आप करते हैं, तो ऐसा कहो! –

+0

मैं एक इंटरफ़ेस को इस तरीके से परिभाषित करने में सक्षम होने के लिए कुछ उपयोग देख सकता था जो किसी को भी उस असेंबली के बाहर लागू करने से मना कर देगा जहां इसे परिभाषित किया गया था। यह वास्तव में "मुहरबंद" कीवर्ड के व्यवहार से मेल नहीं खाएगा, लेकिन विरासत (ओपी का लक्ष्य) की बजाय संरचना के उपयोग को मजबूर करने में मदद करेगा, और उन मामलों में भी मदद करेगा जहां कोई एक अमूर्त वर्ग का उपयोग कर सकता है सिवाय इसके कि कुछ कार्यान्वयन की आवश्यकता है अन्य असंबंधित वर्गों का उत्तराधिकारी। मुझे पता है कि कंपाइलर्स एक इंटरफ़ेस को परिभाषित करने की अनुमति नहीं देगा जो 'आंतरिक' सदस्यों का संदर्भ देता है; सीआईएल में ऐसे इंटरफेस को परिभाषित किया गया तो क्या होगा? – supercat

4

sealed इंटरफ़ेस के संदर्भ में इसका अर्थ यह होगा कि कोई भी वर्ग इस इंटरफ़ेस को कार्यान्वित नहीं कर सकता है। यह बेकार होगा, इसलिए इसकी अनुमति नहीं है।

+1

इंटरफ़ेस से प्राप्त इंटरफेस के बारे में क्या? मैं देख सकता था कि उस बिंदु से 'मुहरबंद' कैसे समझ सकता है। हालांकि इसके अलावा शायद एक कारण है जो इस तरह के प्रतिबंध से कुछ हासिल नहीं करने की तरह समझ में आता है। –

12

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

"इंटरफ़ेस विरासत" से एक इंटरफ़ेस को सील करना कुछ भी नहीं करेगा, क्योंकि लोग केवल आपके इंटरफ़ेस को लागू कर सकते हैं और दूसरा जो आपके इंटरफ़ेस को विरासत में मिला होगा।

+1

"इंटरफेस विरासत" से निपटने के लिए +1 –

1

Sealed कक्षा के लिए एक कीवर्ड है। इंटरफेस का लक्ष्य वर्गों के लिए परिभाषित किए गए अनुबंधों को लागू करने के लिए है। आप कक्षा को सील कर सकते हैं जो एक इंटरफ़ेस लागू करता है, लेकिन एक इंटरफ़ेस को सील करना थोड़ा उपयोग नहीं होगा।

-1

मेरे लिए, interface का अर्थ है abstract keyword; इसलिए यदि कोई इंटरफ़ेस sealed होगा, तो यह sealed abstract होगा जो विरोधाभास प्रतीत होता है।

+1

एफवाईआई, एक "स्थैतिक" वर्ग तार्किक रूप से दोनों सीलबंद और सार है; आप इससे प्राप्त नहीं कर सकते हैं, और आप एक उदाहरण नहीं बना सकते हैं। –

+1

धन्यवाद, एरिक। एक कंपाइलर डेवलपर के साथ बहस करना हमेशा मुझे वास्तव में छोटा और हरा महसूस करता है :-) –

0

इंटरफेस आपका आवेदन अनुबंध है ... जब आपको अपने अनुबंध की आवश्यकता नहीं होती है तो आप इसे क्यों परिभाषित करते हैं?

0

कक्षा को सील करने के प्राथमिक उद्देश्यों में से एक को उस वर्ग के किसी भी स्टोरेज स्थानों की आवश्यकता होती है ताकि व्युत्पन्न प्रकार के बजाय उस सटीक प्रकार के उदाहरण हो सकें। हालांकि अधिकांश कोड दिमाग में नहीं होंगे जब व्युत्पन्न-प्रकार वस्तुओं को बेस-टाइप ऑब्जेक्ट्स के लिए प्रतिस्थापित किया जाता है, ऐसी कई स्थितियां हैं जहां ऐसी प्रतिस्थापन समस्याग्रस्त हो सकती है। उदाहरण के लिए, कुछ वर्गों में एक ही प्रकार की दूसरी वस्तु के साथ सापेक्ष तुलना करने के लिए एक फ़ंक्शन शामिल होता है, उम्मीद है कि तुलना परिणाम एक क्रमबद्ध अनुक्रम उत्पन्न करेंगे। यदि प्रकार Bar और Boz दोनों Foo से निकाले जाते हैं, और किसी भी Bar विशिष्ट या Boz तुलना में विशिष्ट क्षेत्रों का उपयोग, यह समझदारी से Bar और Boz उदाहरणों का एक मिश्रण पकड़े दृश्यों सॉर्ट करने के लिए असंभव हो सकता है।

इस तरह का एक उद्देश्य इंटरफेस के साथ मौजूद नहीं होगा, क्योंकि उनके प्रकृति इंटरफेस द्वारा कई कक्षाओं द्वारा कार्यान्वित किया जा सकता है। एक इंटरफेस जिसे किसी भी वर्ग द्वारा लागू नहीं किया जा सकता है, बेकार होगा, और एक इंटरफेस जिसे केवल एक वर्ग द्वारा लागू किया जा सकता है, व्यर्थ होगा (यदि IFooFoo के अलावा कुछ भी नहीं हो सकता है, तो शायद हर जगह Foo का उपयोग करें एक IFoo का उपयोग करने के इच्छुक होगा)।

मॉड्यूल में इंटरफ़ेस के कार्यान्वयन को प्रतिबंधित करने के लिए कुछ उपयोगीता होगी जहां यह परिभाषित किया गया है, और/या इंटरफेस को internal सदस्यों को अनुमति देने की अनुमति है। मुझे कोई विशेष कारण नहीं पता है कि इसकी अनुमति क्यों नहीं है, न ही ऐसी चीजों को अनुमति देने या अस्वीकार करने से भी उन्हें "मज़बूत" या "कठिन" होना चाहिए।

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

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