2012-06-24 11 views
11

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

मुझे लगता है कि एक कंकाल कार्यान्वयन लगभग एक सार वर्ग के समान है। इन दो अवधारणाओं में भिन्नता कैसे होती है?

+0

_every_ इंटरफ़ेस के लिए? क्या आप इस कथन का एक पृष्ठ संदर्भ दे सकते हैं? – Puce

उत्तर

6

प्रभावी जावा

According to this section of the book एक कंकाल कार्यान्वयन में ऊपर उल्लिखित खंड को फिर से पढ़ने के बाद संपादित एक सार है कक्षा। वह इस दृष्टिकोण की सिफारिश करता है क्योंकि, एक कंकाल कार्यान्वयन के बाद, इंटरफ़ेस को लागू करने और अज्ञात वर्ग के साथ चुनिंदा ओवरराइड विधियों को भी छोटा कर देता है (जैसा कि वह अपनी पुस्तक में करता है)।


पिछला जवाब है, निरंतरता

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

0

ए "कंकाल कार्यान्वयन" एक ठोस वर्ग है: आप इसे संकलित और परीक्षण कर सकते हैं।

एक सार वर्ग नहीं है, और आप नहीं कर सकते;)

+1

-1 आप हर उचित गठित कक्षा को संकलित कर सकते हैं। कंकाल कार्यान्वयन एक अमूर्त वर्ग है। –

+0

दोस्त, एक "कंकाल कार्यान्वयन" जरूरी नहीं है कि एक अमूर्त वर्ग हो। – paulsm4

+0

मैंने मुख्य रूप से "आप संकलित कर सकते हैं" के कारण आपका जवाब घटा दिया। यह पुस्तक में एक अमूर्त वर्ग है। मेरा मतलब यही था। –

2

इंटरफ़ेस/अमूर्त वर्ग एपीआई का हिस्सा है।

कंकाल कार्यान्वयन एक वैध ठोस class है, लेकिन सीमित/भद्दा/खराब कार्यान्वयन; (एक बहुत ही संकलित) उदाहरण के लिए, Sorter इंटरफ़ेस का एक कंकाल कार्यान्वयन bubble sort लागू कर सकता है - आप इसे उत्पादन अनुप्रयोग में उपयोग नहीं करना चाहते हैं, लेकिन यह दिखाता है कि कोई इंटरफ़ेस

4

का अर्थ क्या है इसका मतलब है कि

public interface Foo { 
    void bar(); 
    void baz(); 
} 

private abstract class AbstractFoo implements Foo { 
    ... 
} 

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

BTW, यह क्या संग्रह ढांचे (जो जोश बलोच बनाया) में किया जाता है: Set इंटरफ़ेस AbstractSet द्वारा कार्यान्वित किया जाता, List इंटरफ़ेस AbstractList द्वारा कार्यान्वित किया जाता है, आदि

2

मुझे लगता है कि एक लग रहा है कंकाल कार्यान्वयन लगभग अमूर्त वर्ग जैसा ही है। इन दो अवधारणाओं में भिन्नता कैसे होती है?

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

इसके अलावा, तर्कों के लिए कक्षाओं को स्वीकार करने वाले विधियां संघर्ष को आमंत्रित करती हैं जब कक्षा जिसे हम पास करना चाहते हैं वह पहले से ही उप-वर्ग है; जावा एकाधिक विरासत का समर्थन नहीं करता है। इंटरफेस में यह समस्या नहीं है।