विरासत
एक कार और एक बस पर विचार करें। वे दो अलग-अलग वाहन हैं। लेकिन फिर भी, वे कुछ सामान्य गुणों को साझा करते हैं जैसे कि उनके पास स्टीयरिंग, ब्रेक, गियर, इंजन आदि हैं।
इसलिए विरासत की अवधारणा के साथ, इसे निम्नलिखित के रूप में दर्शाया जा सकता है ...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
अब एक साइकिल ...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
और एक कार ...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
यह सब Inheritance के बारे में है । हम उनका उपयोग वस्तुओं को सरल आधार रूपों और उनके बच्चों में वर्गीकृत करने के लिए करते हैं जैसा कि हमने ऊपर देखा।
सार वर्ग
सार वर्ग अपूर्ण वस्तुएं हैं। इसे और समझने के लिए, आइए एक बार फिर से वाहन सादृश्य पर विचार करें।
एक वाहन चलाया जा सकता है। सही? लेकिन अलग-अलग वाहनों को अलग-अलग तरीकों से चलाया जाता है ... उदाहरण के लिए, आप वैसे ही कार नहीं चला सकते जैसे आप साइकिल चलाते हैं।
तो एक वाहन के ड्राइव फ़ंक्शन का प्रतिनिधित्व कैसे करें? यह जांचना कठिन है कि यह किस प्रकार का वाहन है और इसे अपने स्वयं के फ़ंक्शन के साथ चलाएं; नए प्रकार के वाहन जोड़ने पर आपको बार-बार चालक वर्ग बदलना होगा।
यहाँ अमूर्त वर्गों और विधियों की भूमिका आती है। आप ड्राइव विधि को सार के रूप में परिभाषित कर सकते हैं, यह बताने के लिए कि प्रत्येक विरासत वाले बच्चों को इस फ़ंक्शन को लागू करना होगा।
तो अगर आप वाहन वर्ग को संशोधित करते हैं ...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
साइकिल और कार को यह भी बताना होगा कि इसे कैसे चलाना है। अन्यथा, कोड संकलित नहीं किया जाएगा और एक त्रुटि डाली गई है।
संक्षेप में .. एक अमूर्त वर्ग कुछ अपूर्ण कार्यों के साथ एक आंशिक रूप से अपूर्ण वर्ग है, जिसे विरासत में प्राप्त बच्चों को स्वयं निर्दिष्ट करना चाहिए।
Interfaces
Interfaces पूरी तरह से अधूरी हैं। उनके पास कोई गुण नहीं है। वे सिर्फ संकेत देते हैं कि विरासत में मिले बच्चे कुछ करने में सक्षम हैं ...
मान लीजिए कि आपके पास विभिन्न प्रकार के मोबाइल फोन हैं। उनमें से प्रत्येक के अलग-अलग कार्य करने के अलग-अलग तरीके हैं; Ex: किसी व्यक्ति को कॉल करें फोन का निर्माता यह निर्दिष्ट करता है कि उसे कैसे करना है। यहां मोबाइल फोन एक नंबर डायल कर सकता है - वह है, यह डायल-सक्षम है। आइए इसे एक इंटरफ़ेस के रूप में दर्शाते हैं।
public interface Dialable {
public void dial(Number n);
}
यहां डायल करने वाला निर्माता एक नंबर डायल करने के तरीके को परिभाषित करता है। बस आपको इसे डायल करने के लिए एक नंबर देना होगा।
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
एब्सट्रैक्ट क्लासेस के बजाय इंटरफेस का उपयोग करते हुए, फ़ंक्शन के लेखक जो एक डायल करने योग्य आवश्यकता का उपयोग करता है, उसके गुणों के बारे में चिंता नहीं करता है। Ex: क्या इसमें टच-स्क्रीन या डायल पैड है, क्या यह एक निश्चित लैंडलाइन फोन या मोबाइल फोन है। आपको यह जानना चाहिए कि क्या यह डायल करने योग्य है; यह डायलिबल इंटरफ़ेस को इनहेरिट (या कार्यान्वित) करता है।
और इससे भी महत्वपूर्ण बात यह है कि अगर किसी दिन आप डायलॉग को किसी दूसरे के साथ स्विच करते हैं
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
आप यह सुनिश्चित कर सकते हैं कि कोड अभी भी पूरी तरह से काम करता है क्योंकि जो फ़ंक्शन डायल करने योग्य का उपयोग करता है, वह (और नहीं कर सकता) डायल करने योग्य इंटरफ़ेस में निर्दिष्ट विवरणों के अलावा अन्य पर निर्भर करता है। वे दोनों एक डायल करने योग्य इंटरफ़ेस को लागू करते हैं और यह केवल एक चीज है जिसके बारे में फ़ंक्शन परवाह करता है।
आमतौर पर डेवलपर्स द्वारा ऑब्जेक्ट्स के बीच इंटरऑपरेबिलिटी (इंटरचेंज का उपयोग करें) सुनिश्चित करने के लिए उपयोग किया जाता है, जहां तक वे एक साझा फ़ंक्शन साझा करते हैं (जैसे आप एक लैंडलाइन या मोबाइल फोन में बदल सकते हैं, जहां तक आपको बस एक नंबर डायल करने की आवश्यकता है)। संक्षेप में, इंटरफेस किसी भी गुण के बिना, अमूर्त वर्गों का एक बहुत सरल संस्करण है।
इसके अलावा, ध्यान दें कि आप जितने चाहें उतने इंटरफ़ेस लागू कर सकते हैं (इनहेरिट) कर सकते हैं, लेकिन आप केवल एकल पैरेंट क्लास का विस्तार (इनहेरिट) कर सकते हैं।
अधिक जानकारी
सार कक्षाएं बनाम इंटरफेस