2016-06-18 5 views
11

लागू करने के लिए कहा जाना चाहिए, मुझे पता है कि एक इंटरफ़ेस का अर्थ क्या है (तकनीकी रूप से), लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि "अनुबंध" में क्या शामिल है:एक वर्ग को एक इंटरफेस के दस्तावेज अनुबंध का पालन करना चाहिए जिसे इंटरफ़ेस

मान लें कि मैं एक कक्षा MyList बनाती हूं जो java.util.List लागू करता है (यानी, मैं संकलित कोड के साथ सभी विधियों को लागू करता हूं), MyListList है? या क्या मुझे उन तरीकों की सभी टिप्पणियों को पढ़ने की ज़रूरत है जिन्हें मैं ओवरराइड करता हूं और सुनिश्चित करता हूं कि मेरा कार्यान्वयन व्यवहार पर इन "उम्मीद" को पूरा करता है?

+0

माईलिस्ट एक सूची है? हां – Enzokie

+0

@Enzokie तो मैं कुछ भी करने के लिए 'add' लागू नहीं करूँगा और हमेशा 'शून्य' वापस लौटने के लिए लागू करूंगा, फिर भी आप इसे एक सूची कहेंगे? –

+0

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

उत्तर

12

तकनीकी रूप से, हाँ, MyListList है यदि यह List इंटरफ़ेस के सभी विधियों को लागू करता है। लेकिन संकलक कोई जादूगर नहीं है। यह जांच नहीं कर सकता कि आपके तरीके वे करते हैं जो उन्हें करना चाहिए। और निश्चित रूप से, प्रत्येक विधि को यह करना चाहिए कि इसका दस्तावेज क्या करता है।

अगर मैं एक List प्राप्त करते हैं, और इस ListMyList का एक उदाहरण है, और मैं list.add("foo") कहते हैं, मैं उम्मीद "foo" सूची के अंत में जोड़ा जा सके। हटाया नहीं जाना चाहिए, या दो बार जोड़ा नहीं जा सकता है, या जो भी अन्य व्यवहार। तो, ज़ाहिर है, अगर आपकी कक्षा List लागू करती है, तो इसके तरीकों को अपने एपीआई दस्तावेज में परिभाषित अनुबंध का पालन करना चाहिए।

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

+0

हाहा महान उदाहरण +1 – rpax

+0

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

+0

जेडीके इस तरह के यूनिट परीक्षण प्रदान नहीं करता है। इसे लागू करने के लिए आप पर निर्भर है। लेकिन अनुबंध कभी नहीं बदलेगा: इससे सभी मौजूदा जावा कोड तोड़ जाएंगे। एक मानक संग्रह को लागू करना बिल्कुल एक आम काम नहीं है। जेडीके, और सामान्य पुस्तकालयों जैसे गुवा, आपको 99.9 99% उपयोग-मामलों के लिए आवश्यक सभी प्रदान करते हैं। जावा प्रोग्रामिंग के 20 वर्षों में एक बार मानक संग्रह लागू करने के बाद मैं remamber नहीं कर सकता। –

2

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

आप अपनी कक्षा परिभाषा में implements InterfaceName डालते समय एक इंटरफेस लागू करते हैं। आपको इंटरफ़ेस के सभी तरीकों को परिभाषित करना होगा, या आपका ऐप संकलित नहीं होगा। फिर हां, यह कहना सही होगा कि MyClass एक MyInterface है- आप MyInterface इंटरफ़ेस = नया MyClass() भी जा सकते हैं;

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

+0

नहीं, java.util.List एक वर्ग –

+0

नहीं है इससे पहले कि आप इसे पोस्ट करने से पहले :) –

+1

उह..जावा 8+ इंटरफ़ेस पर कार्यान्वयन की अनुमति देता है। सीमित, लेकिन संभव है। – rpax

1

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

एक आसान उदाहरण ICloneable इंटरफ़ेस है। तो तुम सब को लागू

public MyObject clone() { 
    return (MyObject)super.clone(); 
} // clone() 

है, तो आप भाषा अनुबंध पूरे कर लिए हैं, और शायद अपने वर्ग 'भी अनुबंध। लेकिन अगर आपकी कक्षा में List है, तो आप अपने उपयोगकर्ताओं को आश्चर्यचकित करेंगे: "यह clone() सही नहीं था!"

अनुबंध में उपयोगकर्ता अपेक्षाएं भी शामिल हैं। उन्हें तोड़ दो, और हालांकि एक भाषा वकील कह सकता है कि आपकी कक्षा है- List, अन्य सहमत नहीं होंगे ..

+0

'आईसीएलनेबल' इंटरफ़ेस क्या है जिसके बारे में आप बात कर रहे हैं? [java.lang.Cloneable] (https://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html) एक मार्कर-इंटरफेस है और आपको क्लोन को ओवरराइड करने के लिए भी मजबूर नहीं करता है () '। लेकिन आप सही हैं, मार्कर इंटरफेस ([Serializable] (https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html) एक और लोकप्रिय उदाहरण होगा) केवल एक प्रकार के रूप में मौजूद है अनुबंध को पूरा करने का वादा - कार्यान्वयन संकलन करने के लिए यह छोटा है, लेकिन अनुबंध को पूरा किए बिना, यह बेकार है। – Hulk

0

माईलिस्ट एक सूची है?

इस प्रश्न को आप पहली बार की जरूरत को समझने के लिए इंटरफेस है या क्या वे लिखा जाता है न के लिए ...

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

तो जब आप सूची myContainer = new ArrayList() कहते हैं; आप किसी ऑब्जेक्ट को परिभाषित कर रहे हैं जो एक सूची कर सकता है ... जोड़ें, निकालें, आदि आदि

आप इसे एक सूची कह सकते हैं, मैं कहूंगा कि यह एक सूची कर सकता है ..

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