2010-01-19 15 views
13

क्या कोई मुझे बता सकता है कि पूरी तरह से अमूर्त वर्ग और इंटरफ़ेस के बीच वास्तव में क्या अंतर है?शुद्ध अमूर्त वर्ग और इंटरफेस

एक सार वर्ग में इसके सभी तरीकों को सार तत्व भी हो सकता है। एक इंटरफ़ेस में सार के रूप में इसकी सभी विधियां हैं। इस परिदृश्य में दोनों के बीच मुख्य अंतर क्या है?

यदि शुद्ध सार कक्षा और इंटरफ़ेस के बीच कोई अंतर है? इंटरफ़ेस का उपयोग क्या है? जहां इंटरफ़ेस का उपयोग किया जा रहा है हम शुद्ध अमूर्त वर्ग का उपयोग कर सकते हैं?

उत्तर

14

पूर्व उत्तरों को पूरा करने के लिए:

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

एक सार वर्ग एक कंकाल है। यह एक निश्चित तरीके से परिभाषित करता है कि इसके विस्तारित वर्ग काम करेंगे जबकि उन्हें कुछ खाली स्थान (अमूर्त विधियों) अद्वितीय होने दें।

एक शुद्ध सार वर्ग एक अंतरफलक के रूप में ही बात कर रहे हैं, लेकिन अद्वितीय इतना विस्तार, मेरे लिए की समस्या है, यह कोई दिलचस्पी नहीं

+1

एक शुद्ध अमूर्त वर्ग में अद्वितीय विस्तार की समस्या है लेकिन जनता की तुलना में अन्य सुलभताओं को परिभाषित कर सकते हैं। – csblo

2

एक अमूर्त वर्ग एक कार्यान्वयन प्रदान कर सकता है, यानी (सार्वजनिक, संरक्षित, निजी) विधि निकायों। एक इंटरफेस सिर्फ सार्वजनिक विधि हस्ताक्षर घोषित कर सकता है। इंटरफेस को लागू करने वाले वर्गों द्वारा इन तरीकों को (विधि निकायों के रूप में) महसूस किया जाना चाहिए।

5

में जावा और सी #, एक से निकाले जाते हैं करने के लिए कई इंटरफेस का उपयोग कर सकते हैं और केवल एक ही वर्ग के वारिस को

+1

यह उत्तर –

+1

यह उत्तर नहीं है क्योंकि एक बहुत ही महत्वपूर्ण पहलू का उल्लेख नहीं किया गया है: सार वर्ग * सदस्यों को लागू कर सकते हैं। –

+1

@Wim: सच है, लेकिन यदि आप मूल प्रश्न के दूसरे पैराग्राफ को पढ़ते हैं तो यह स्पष्ट है कि ओपी केवल उन सार वर्गों में रुचि रखता है जिनके पास कोई भी तरीका लागू नहीं होता है और इस प्रकार लगभग इंटरफेस की तरह दिखते हैं। – catwalk

10

, से हर इंटरफ़ेस परोक्ष सार है: इंटरफेस के शरीर में हर विधि घोषणा परोक्ष अमूर्त और सार्वजनिक है।

एक अमूर्त वर्ग में विधियां हैं जिनमें कार्यान्वयन हो सकता है। सार विधियां या तो सार्वजनिक, संरक्षित या डिफ़ॉल्ट पहुंच (पैकेज दृश्यमान) हो सकती हैं। इंटरफेस के विपरीत अमूर्त कक्षाओं में ऐसे क्षेत्र हो सकते हैं जो स्थैतिक और अंतिम नहीं हैं।

यह भी देखें:
Interfaces vs Abstract classes और Java tutorial

0

एक वर्ग एकाधिक इंटरफेस को लागू कर सकते हैं, लेकिन केवल एक ही वर्ग (सार या अन्यथा) से विस्तार। यदि आपको इंटरफ़ेस निर्दिष्ट करने की आवश्यकता है, तो आपको एक इंटरफ़ेस का उपयोग करना चाहिए, ताकि कक्षाएं आपके कई इंटरफ़ेस को कार्यान्वित कर सकें।

2

तीन मतभेद हैं:

  1. इंटरफेस केवल सार्वजनिक तरीकों (यानी कोई संरक्षित या पैकेज-निजी दिखाई विधि) घोषित कर सकते हैं और किसी भी क्षेत्रों
  2. उपवर्गों केवल विस्तार कर सकते हैं की घोषणा नहीं कर सकते हैं सबसे एक अमूर्त वर्ग पर , लेकिन इंटरफेस
  3. सार वर्ग भी कुछ या तरीकों के सभी के लिए कार्यान्वयन हो सकता है की किसी भी संख्या को लागू कर सकते
+0

और एक अमूर्त वर्ग * कर सकते हैं * विधियों को लागू किया है। –

1

आप एकाधिक विरासत के लिए इंटरफेस का उपयोग कर सकते हैं, लेकिन आप एकाधिक विरासत के लिए अमूर्त वर्ग का उपयोग नहीं कर सकते हैं।

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

1

है मैं तो बस (एक बिंदु को संबोधित करने के लिए जा रहा हूँ जिसका मुख्य कारण अन्य प्रश्न पहले से ही संबोधित किया गया है):

"जहां इंटरफेस का उपयोग किया जा रहा है हम शुद्ध अमूर्त वर्ग का उपयोग कर सकते हैं?"

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

2

चूंकि प्रश्न शुद्ध अमूर्त वर्गों के बाद है, तो मैं कहूंगा कि उत्तर विरासत और दायरे से संबंधित होगा। यह कुछ ऐसा है जो मैंने कई बार सोच लिया है और यही वह है जो मैंने साथ किया है।

जाहिर है कि एकाधिक विरासत से संबंधित सुविधाओं का उत्तर पहले दिया गया है, इसलिए मैं इसमें से किसी भी में नहीं जाऊंगा। हालांकि दायरा एक बड़ा है।

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

इस तरह के एक वर्ग परिभाषा से विरासत (वर्ग के उपभोक्ताओं के लिए निजी तौर पर सार सदस्य, लेकिन यह गुंजाइश लागू करने के लिए यह protected इसलिए जब तक वर्ग के रूप में sealed आगे उत्तराधिकारियों के लिए होता है चिह्नित किया गया था के रूप में परिभाषित करना होगा, हालांकि उत्तराधिकारी मजबूर होना पड़ा पहुंच)।

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

HTH

+2

जावा में कोई 'मुहरबंद' कीवर्ड नहीं है; उपclass को 'अंतिम' के रूप में चिह्नित किया जाना होगा। –

3

यह नहीं एक बहुत theorotical explaination लेकिन, प्रोग्राम के द्वारा यह सब सही

        Interface     Abstract Class 
Extend Class       No       Yes 
Extend Abstract Class     No       Yes 
Implement Interface      Yes(Extend Interface)  Yes 
Variables        Public Static Final   Public/Protected/Private/static/final/transient/volatile 
Contain Non-Public Method    No       Public/Protected/*Private 
Contain Abstract Method     Yes       Yes 
Contain No-Body, Non-Abstract Method Yes       No 
Contain Defined Method     No       Yes 
Contain Main Method      No       Yes 

* सार कक्षाएं निजी तरीकों, लेकिन नहीं सार निजी तरीकों हो सकता है कर रहा है।

3

इंटरफ़ेस पर शुद्ध सारणी चुनने का एक कारण उप वर्गों को एक सुपर क्लास द्वारा लागू किए गए विशेष तरीकों को लागू करने के लिए मजबूर करना है।

उदाहरण के लिए (जावा में),

आप toString लागू करने के लिए(), के बराबर होती है() सभी का विस्तार कक्षाएं चाहते कहो, और hashCode()।

आप उस अनुबंध के लिए ForceSomeMethods नामक एक इंटरफ़ेस बना सकते हैं, लेकिन उन विधियों को ऑब्जेक्ट द्वारा निहित रूप से कार्यान्वित किया जाता है।

फोर्ससोम विधि को सार तत्वों के रूप में toString(), आदि के साथ एक शुद्ध अमूर्त वर्ग बनाना, सभी उप-वर्गों को उन विधियों को लागू करने के लिए मजबूर किया जाएगा।

+0

यह वास्तव में एक दिलचस्प जवाब है, और एक जिसे मैंने कहीं और नहीं देखा था। पूरा जवाब नहीं, लेकिन एक बहुत ही मूल्यवान विस्तार। –

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