2010-05-15 15 views
7

मैं किताब पढ़ रहा हूँ - Hadoop: The Definitive Guideजावा इंटरफेस और अमूर्त वर्ग मुद्दा

में अध्याय 2 (पेज 25), यह उल्लेख किया गया है "नई एपीआई इंटरफेस पर अमूर्त वर्ग, के पक्ष में है क्योंकि इन विकसित करने के लिए आसान कर रहे हैं के लिए। उदाहरण के लिए, आप कक्षा के पुराने कार्यान्वयन को तोड़ने के बिना एक अमूर्त वर्ग में एक विधि (डिफ़ॉल्ट कार्यान्वयन के साथ) जोड़ सकते हैं। " इसका क्या अर्थ है (विशेष रूप से इसका अर्थ है "कक्षा के पुराने कार्यान्वयन को तोड़ना")? अगर कोई मुझे नमूना दिखा सकता है तो सराहना करें इस परिप्रेक्ष्य अमूर्त वर्ग से इंटरफ़ेस से बेहतर क्यों है? पहले से

धन्यवाद, जॉर्ज

उत्तर

10

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

इंटरफ़ेस एक

interface A { 
    public void foo(); 
} 

और एक वर्ग बी को देखते हुए:

class B implements A { 
    @Override 
    public void foo() { 
     System.out.println("foo"); 
    } 
} 

:

class B implements A { 
} 

यह गया है विधि इंटरफ़ेस में परिभाषित के लिए एक कार्यान्वयन प्रदान अन्यथा यह संकलन-समय त्रुटि है। अब एक विधि की डिफ़ॉल्ट कार्यान्वयन के साथ एक अमूर्त वर्ग ले:

abstract class C { 
    public void bar() { 
     System.out.println("bar"); 
    } 
} 

जहां एक वर्ग इस सार वर्ग से इनहेरिट इस तरह दिख सकता:

class D extends C { } 

एक त्रुटि के बिना। लेकिन अगर यह ऐसा करने के इच्छुक है तो यह डिफ़ॉल्ट विधि कार्यान्वयन को ओवरराइड भी कर सकता है।

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

+0

धन्यवाद! जो मैं भ्रमित कर रहा हूं वह यह बयान है - पुस्तक में "कक्षा के पुराने कार्यान्वयन को तोड़ना"। "कक्षा" का अर्थ वर्ग वर्ग से प्राप्त होता है, या वर्ग जो अमूर्त वर्ग पर आधारित है? – George2

+1

@ जॉर्ज: इसका अर्थ यह है कि इंटरफ़ेस/अमूर्त वर्ग के पुराने संस्करण से प्राप्त कक्षा। इंटरफेस के साथ यह अब मान्य नहीं है क्योंकि यह इंटरफ़ेस में जोड़े गए किसी विधि को लागू करने में विफल रहता है। अमूर्त वर्गों और गैर-अमूर्त तरीकों के साथ यह केवल बेस क्लास के कार्यान्वयन का आनंद उठा सकता है बिना यह जानकर कि वह वहां है। – Joey

+0

धन्यवाद! आपका मतलब है संस्करण 1 में मान लीजिए, अमूर्त वर्ग में विधि फू है और एक वर्ग अमूर्त वर्ग के उपकरण से प्राप्त होता है। और अमूर्त वर्ग के संस्करण 2 में, एक नई विधि गुओ जोड़ा जाता है, और व्युत्पन्न कक्षा अभी भी प्रभावित किए बिना काम करेगी (यदि गो के पास अमूर्त वर्ग में डिफ़ॉल्ट कार्यान्वयन है)? – George2

6

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

वैकल्पिक रूप से, यदि आप किसी इंटरफ़ेस में कोई विधि जोड़ते हैं, तो उस इंटरफ़ेस को लागू करने वाले किसी भी वर्ग को विधि को कार्यान्वित करने की आवश्यकता होती है - अन्यथा वे संकलित नहीं होंगे।

+0

धन्यवाद! "किसी भी आधार वर्ग में कुछ भी बदलने की जरूरत नहीं है" - "किसी भी आधार वर्ग", आपका मतलब अमूर्त वर्ग का आधार वर्ग है, या वर्ग जो अमूर्त वर्ग से निकला है? – George2

+1

डॉन। मुझे बस उन उदाहरणों को छोड़ देना चाहिए था। मुझे चार और मिनट लगे ;-) – Joey

+0

उपरोक्त मेरी टिप्पणी का कोई जवाब? :-) – George2

1

कृपया यह भी ग्रहण विकी से निम्नलिखित दिशानिर्देशों का संदर्भ

विकासशील जावा आधारित एपीआई

Adding an API method

उदाहरण 4 - API पद्धति

जोड़ना API पद्धति जोड़ने कर सकते हैं मौजूदा ग्राहकों के साथ एक वर्ग या इंटरफ़ेस ब्रेक संगतता के लिए?

यदि विधि किसी इंटरफ़ेस में जोड़ा गया है जो ग्राहक लागू कर सकते हैं, तो यह निश्चित रूप से एक तोड़ने वाला परिवर्तन है।

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

हालांकि, यदि विधि उस वर्ग में जोड़ दी जाती है जो ग्राहक subclass कर सकते हैं, तो परिवर्तन सामान्य रूप से एक तोड़ने के रूप में देखा जाना चाहिए। इस कठोर निष्कर्ष का कारण यह है कि ग्राहक के उप-वर्ग के पास पहले से ही उस नाम से एक विधि का अपना कार्यान्वयन है। सुपरक्लस में एपीआई विधि जोड़ना क्लाइंट के कोड को कम करता है क्योंकि क्लाइंट की मौजूदा विधि नए जोड़े गए विधि के एपीआई अनुबंध से मुलाकात करती है, तो यह बेहद संयोग होगा। व्यावहारिक रूप से, यदि इस तरह के नाम संयोग की संभावना पर्याप्त रूप से कम है, तो इस प्रकार के परिवर्तन को अक्सर माना जाता है जैसे यह टूट रहा था।

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