संपादित करें: मैंने इस सवाल का जवाब दिया क्योंकि प्रोग्रामिंग सीखने वाले लोगों का एक समूह है जो यह पूछ रहा है, और अधिकांश उत्तर बहुत तकनीकी रूप से सक्षम हैं, लेकिन वे समझने में आसान नहीं हैं यदि आप एक नौसिखिया हैं। हम सभी नए-नए थे, इसलिए मैंने सोचा कि मैं एक और नौसिखिया के अनुकूल उत्तर पर अपना हाथ आजमाऊंगा।
दो मुख्य हैं बहुरूपता, और मान्यता। भले ही यह एक बेवकूफ डेटा संरचना है।
मान लीजिए कि हमारे पास यह सरल वर्ग है:
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
एक बहुत ही सरल वर्ग जो धारण करता है कि उसमें कितना तरल है, और इसकी क्षमता क्या है (मिलीलीटर में)।
जब मैं करता हूं तो क्या होता है:
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
ठीक है, आप उम्मीद नहीं करेंगे कि काम करने के लिए, है ना? आप चाहते हैं कि किसी प्रकार की पवित्रता की जाँच हो। और इससे भी बदतर, अगर मैंने अधिकतम क्षमता कभी नहीं निर्दिष्ट की तो क्या होगा? ओह प्रिय, हमें एक समस्या है।
लेकिन एक और समस्या भी है। क्या होगा अगर बोतलें सिर्फ एक प्रकार के कंटेनर थे? क्या होगा अगर हमारे पास कई कंटेनर थे, सभी क्षमता और तरल की मात्रा से भरे हुए? अगर हम सिर्फ एक इंटरफ़ेस बना सकते हैं, तो हम अपने प्रोग्राम के बाकी हिस्सों को उस इंटरफ़ेस को स्वीकार करने दे सकते हैं, और बोतलें, जेरीकेन्स और सभी प्रकार के सामान सिर्फ इंटरचेंज काम करेंगे। यह बेहतर नहीं होगा? चूंकि इंटरफेस डिमांड के तरीकों को बेहतर बनाता है, इसलिए यह भी एक अच्छी बात है।
हम कुछ इस तरह से समाप्त करेंगे:
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
महान! और अब हम सिर्फ बोतल को इसमें बदलते हैं:
public class Bottle extends LiquidContainer {
private int capacityMl;
private int amountFilledMl;
public Bottle(int capacityMl, int amountFilledMl) {
this.capacityMl = capacityMl;
this.amountFilledMl = amountFilledMl;
checkNotOverFlow();
}
public int getAmountMl() {
return amountFilledMl;
}
public void setAmountMl(int amountMl) {
this.amountFilled = amountMl;
checkNotOverFlow();
}
public int getCapacityMl() {
return capacityMl;
}
private void checkNotOverFlow() {
if(amountOfWaterMl > capacityMl) {
throw new BottleOverflowException();
}
}
मैं एक अभ्यास के रूप में बॉटलऑवरफ्लो एक्ससेप्शन की परिभाषा को एक पाठक के पास छोड़ दूँगा।
अब ध्यान दें कि यह कितना मजबूत है। अब हम अपने कोड में किसी भी प्रकार के कंटेनर के साथ बोतल के बजाय लिक्विडकोर्नर को स्वीकार कर सकते हैं। और ये बोतलें इस तरह के सामान से कैसे निपट सकती हैं, यह सब अलग-अलग हो सकता है। आपके पास ऐसी बोतलें हो सकती हैं जो बदलने पर उनके राज्य को डिस्क पर लिखती हैं, या जो बोतलें SQL डेटाबेस या GNU पर सहेजती हैं, उन्हें पता है कि और क्या है।
और इन सभी के पास विभिन्न व्हाट्सएप को संभालने के लिए अलग-अलग तरीके हो सकते हैं। बोतल सिर्फ जांच करती है और अगर यह बह निकला है तो यह एक RuntimeException फेंकता है। लेकिन यह गलत काम हो सकता है। (त्रुटि से निपटने के बारे में एक उपयोगी चर्चा होनी है, लेकिन मैं इसे उद्देश्य पर बहुत सरल रख रहा हूं। टिप्पणियों में लोग इस सरल दृष्टिकोण की खामियों को इंगित करेंगे;)।
और हाँ, ऐसा लगता है कि हम एक बहुत ही सरल विचार से बहुत बेहतर उत्तर प्राप्त कर रहे हैं।
कृपया ध्यान दें कि आप बोतल की क्षमता को नहीं बदल सकते। यह अब पत्थर में सेट है। आप इसे अंतिम घोषित करके एक इंट के साथ कर सकते हैं। लेकिन अगर यह एक सूची थी, तो आप इसे खाली कर सकते हैं, इसमें नई चीजें जोड़ सकते हैं, और इसी तरह। आप सराय को छूने की पहुंच को सीमित नहीं कर सकते।
तीसरी बात यह भी है कि सभी ने संबोधित नहीं किया है: गेटर्स और सेटर्स मेथड कॉल का उपयोग करते हैं। इसका मतलब है कि वे हर जगह सामान्य तरीकों की तरह दिखते हैं। डीटीओ और सामान के लिए अजीब विशिष्ट सिंटैक्स होने के बजाय, आपके पास हर जगह एक ही चीज है।