इंटरफ़ेस और अमूर्त वर्ग के बीच वास्तव में क्या अंतर है?
इंटरफ़ेस और अमूर्त वर्ग के बीच वास्तव में क्या अंतर है?
जवाबों:
एक इंटरफेस एक अनुबंध है : इंटरफ़ेस लिखने वाला व्यक्ति कहता है, " अरे, मैं चीजों को इस तरह से देखता हूं " और इंटरफ़ेस का उपयोग करने वाला व्यक्ति कहता है " ठीक है, जिस वर्ग को मैं लिखता हूं वह इस तरह दिखता है "।
एक इंटरफ़ेस एक खाली शेल है । केवल विधियों के हस्ताक्षर हैं, जिसका अर्थ है कि विधियों में शरीर नहीं है। इंटरफ़ेस कुछ नहीं कर सकता। यह सिर्फ एक पैटर्न है।
उदाहरण के लिए (छद्म कोड):
// I say all motor vehicles should look like this:
interface MotorVehicle
{
void run();
int getFuel();
}
// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{
int fuel;
void run()
{
print("Wrroooooooom");
}
int getFuel()
{
return this.fuel;
}
}
एक इंटरफ़ेस को लागू करने से बहुत कम सीपीयू की खपत होती है, क्योंकि यह एक वर्ग नहीं है, सिर्फ नामों का एक गुच्छा है, और इसलिए ऐसा करने के लिए कोई महंगा लुक-अप नहीं है। यह बहुत अच्छा है जब यह मायने रखता है, जैसे कि एम्बेडेड डिवाइस।
अमूर्त वर्ग, इंटरफेस के विपरीत, कक्षाएं हैं। वे उपयोग करने के लिए अधिक महंगे हैं, क्योंकि जब आप उनसे विरासत में लेते हैं तो ऐसा करने के लिए एक लुक-अप होता है।
एब्सट्रैक्ट क्लासेस बहुत कुछ इंटरफेस जैसा दिखता है, लेकिन उनके पास कुछ और है: आप उनके लिए एक व्यवहार को परिभाषित कर सकते हैं। यह कहना एक व्यक्ति के बारे में अधिक है, " इन वर्गों को उस तरह दिखना चाहिए, और उनके पास सामान्य रूप से ऐसा है, इसलिए रिक्त स्थान भरें ।"
उदाहरण के लिए:
// I say all motor vehicles should look like this:
abstract class MotorVehicle
{
int fuel;
// They ALL have fuel, so lets implement this for everybody.
int getFuel()
{
return this.fuel;
}
// That can be very different, force them to provide their
// own implementation.
abstract void run();
}
// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
void run()
{
print("Wrroooooooom");
}
}
जबकि अमूर्त वर्ग और इंटरफेस को अलग-अलग अवधारणा माना जाता है, कार्यान्वयन कभी-कभी इस कथन को असत्य बनाते हैं। कभी-कभी, वे भी नहीं हैं जो आप सोचते हैं कि वे हैं।
जावा में, इस नियम को दृढ़ता से लागू किया गया है, जबकि PHP में, इंटरफेस अमूर्त वर्ग हैं जिनकी कोई विधि घोषित नहीं की गई है।
पायथन में, अमूर्त कक्षाएं अधिक प्रोग्रामिंग चाल हैं जो आप एबीसी मॉड्यूल से प्राप्त कर सकते हैं और वास्तव में मेटाक्लासेस और इसलिए कक्षाएं उपयोग कर रहे हैं। और इंटरफेस इस भाषा में डक टाइपिंग से अधिक संबंधित हैं और यह सम्मेलनों और विशेष विधियों के बीच एक मिश्रण है जो डिस्क्रिप्टर (__method__ तरीकों) को कहते हैं।
प्रोग्रामिंग के साथ हमेशा की तरह, सिद्धांत, अभ्यास और किसी अन्य भाषा में अभ्यास :-)
interface
और class
से Head First Java
ज्वलंत है किA class defines who you are, and an interface tells what roles you could play
एक सार वर्ग और एक इंटरफ़ेस के बीच मुख्य तकनीकी अंतर हैं:
अमूर्त वर्गों में स्थिरांक, सदस्य, विधि स्टब्स (शरीर के बिना तरीके) और परिभाषित तरीके हो सकते हैं, जबकि इंटरफेस में केवल स्थिरांक और विधियाँ स्टब्स हो सकते हैं ।
एक अमूर्त वर्ग के तरीकों और सदस्यों को किसी भी दृश्यता के साथ परिभाषित किया जा सकता है , जबकि एक इंटरफ़ेस के सभी तरीकों को परिभाषित किया जाना चाहिए public
(वे डिफ़ॉल्ट रूप से सार्वजनिक रूप से परिभाषित होते हैं)।
जब एक अमूर्त कक्षा विरासत में मिलती है, तो एक ठोस बाल वर्ग को अमूर्त विधियों को परिभाषित करना चाहिए , जबकि एक अमूर्त वर्ग एक और अमूर्त वर्ग का विस्तार कर सकता है और मूल कक्षा से अमूर्त विधियों को परिभाषित करने की आवश्यकता नहीं है।
इसी तरह, एक अन्य इंटरफ़ेस का विस्तार करने वाला इंटरफ़ेस , मूल इंटरफ़ेस से विधियों को लागू करने के लिए ज़िम्मेदार नहीं है। ऐसा इसलिए है क्योंकि इंटरफेस किसी भी कार्यान्वयन को परिभाषित नहीं कर सकते हैं।
एक बच्चा वर्ग केवल एक ही वर्ग (अमूर्त या ठोस) का विस्तार कर सकता है, जबकि एक इंटरफ़ेस विस्तार कर सकता है या एक वर्ग कई अन्य इंटरफेस को लागू कर सकता है ।
एक बच्चा वर्ग समान या कम प्रतिबंधात्मक दृश्यता के साथ अमूर्त विधियों को परिभाषित कर सकता है , जबकि एक इंटरफ़ेस को लागू करने वाले वर्ग को सटीक समान दृश्यता (सार्वजनिक) के साथ तरीकों को परिभाषित करना होगा।
CANNOT
कि तत्काल होती है।
एक इंटरफ़ेस में केवल कार्यक्षमता की परिभाषा / हस्ताक्षर शामिल हैं, और अगर हमारे पास कुछ सामान्य कार्यक्षमता के साथ-साथ सामान्य हस्ताक्षर भी हैं, तो हमें एक सार वर्ग का उपयोग करने की आवश्यकता है। अमूर्त वर्ग का उपयोग करके, हम व्यवहार और साथ ही कार्यक्षमता दोनों को एक ही समय में प्रदान कर सकते हैं। अमूर्त वर्ग को प्राप्त करने वाला एक अन्य डेवलपर इस कार्यक्षमता का आसानी से उपयोग कर सकता है, क्योंकि उन्हें केवल रिक्त स्थान भरने की आवश्यकता होगी।
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in -c-net.html
एक स्पष्टीकरण यहां पाया जा सकता है: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Prtern.htm
एक अमूर्त वर्ग एक ऐसा वर्ग है जो केवल प्रोग्रामर द्वारा आंशिक रूप से लागू किया जाता है। इसमें एक या अधिक सार विधियाँ हो सकती हैं। एक अमूर्त विधि केवल एक फ़ंक्शन परिभाषा है जो प्रोग्रामर को यह बताने के लिए कार्य करती है कि विधि को एक बच्चे की कक्षा में लागू किया जाना चाहिए।
एक इंटरफ़ेस एक अमूर्त वर्ग के समान है; वास्तव में इंटरफेस समान नामस्थानों को वर्ग और अमूर्त कक्षाओं में रखते हैं। उस कारण से, आप क्लास के समान नाम वाले इंटरफ़ेस को परिभाषित नहीं कर सकते हैं। एक इंटरफ़ेस पूरी तरह से सार वर्ग है; इसके किसी भी तरीके को लागू नहीं किया जाता है और इसके बजाय एक क्लास उप-क्लासिंग से, उस इंटरफ़ेस को लागू करने के लिए कहा जाता है।
वैसे भी मुझे इंटरफेस की यह व्याख्या कुछ भ्रामक लगती है। एक अधिक सामान्य परिभाषा है: एक इंटरफ़ेस एक अनुबंध को परिभाषित करता है जिसे लागू करने वाली कक्षाओं को पूरा करना होगा। एक इंटरफ़ेस परिभाषा में किसी भी कार्यान्वयन कोड के बिना सार्वजनिक सदस्यों के हस्ताक्षर शामिल हैं।
मैं उन अंतरों को उजागर नहीं करना चाहता, जो पहले से ही कई उत्तरों में कहा गया है (इंटरफ़ेस में चर के लिए सार्वजनिक स्थैतिक अंतिम संशोधक के बारे में, अमूर्त कक्षाओं में संरक्षित, निजी तरीकों के लिए समर्थन)
सरल शब्दों में, मैं कहना चाहूंगा:
इंटरफ़ेस: कई असंबंधित वस्तुओं द्वारा एक अनुबंध को लागू करने के लिए
अमूर्त वर्ग: कई संबंधित वस्तुओं के बीच एक ही या अलग व्यवहार को लागू करने के लिए
ओरेकल दस्तावेज से
अमूर्त कक्षाओं का उपयोग करने पर विचार करें यदि:
यदि इंटरफेस का उपयोग करने पर विचार करें :
Serializable
इंटरफ़ेस को लागू कर सकते हैं ।अमूर्त वर्ग की स्थापना "ठोस वर्गों के साथ एक संबंध है।" इंटरफ़ेस प्रदान करता है "वर्गों के लिए एक" क्षमता है।
यदि आप Java
प्रोग्रामिंग भाषा के रूप में देख रहे हैं, तो यहां कुछ और अपडेट हैं:
जावा 8 ने एक विधि सुविधा प्रदान करके वर्गों interface
और abstract
वर्गों के बीच अंतर को कुछ हद तक कम कर दिया है default
। एक इंटरफ़ेस में एक विधि के लिए कार्यान्वयन नहीं है जो अब मान्य नहीं है।
अधिक जानकारी के लिए इस प्रलेखन पृष्ठ का संदर्भ लें ।
बेहतर समझने के लिए कोड उदाहरणों के लिए इस एसई प्रश्न पर एक नज़र डालें।
मुझे इंटरफ़ेस और अमूर्त वर्ग के बीच अंतर कैसे समझाया जाना चाहिए?
कुछ महत्वपूर्ण अंतर:
तालिका के रूप में:
के रूप में जो javapapers से कहा गया है :
1. मुख्य अंतर एक जावा इंटरफेस की विधियां हैं, संक्षेप में सार हैं और कार्यान्वयन नहीं हो सकते हैं। जावा सार वर्ग में ऐसे तरीके हो सकते हैं जो एक डिफ़ॉल्ट व्यवहार को लागू करता है।
2. जावा इंटरफ़ेस में घोषित चर डिफ़ॉल्ट रूप से होता है। एक अमूर्त वर्ग में गैर-अंतिम चर हो सकते हैं।
जावा इंटरफेस के 3. डिफ़ॉल्ट रूप से सार्वजनिक होते हैं। एक जावा अमूर्त वर्ग में कक्षा के सदस्यों के सामान्य स्वाद जैसे निजी, संरक्षित, आदि हो सकते हैं।
4. जावा इंटरफेस को कीवर्ड "इम्प्लीमेंट्स" का उपयोग करके लागू किया जाना चाहिए; एक जावा अमूर्त वर्ग को कीवर्ड "एक्सटेंड्स" का उपयोग करके बढ़ाया जाना चाहिए।
5. एक इंटरफ़ेस केवल एक और जावा इंटरफ़ेस का विस्तार कर सकता है, एक अमूर्त वर्ग दूसरे जावा वर्ग का विस्तार कर सकता है और कई जावा इंटरफेस को लागू कर सकता है।
6.A जावा वर्ग कई इंटरफेस को लागू कर सकता है लेकिन यह केवल एक सार वर्ग का विस्तार कर सकता है।
7.Interface बिल्कुल सार है और इसे तुरंत नहीं किया जा सकता है; एक जावा अमूर्त वर्ग भी तात्कालिक नहीं हो सकता है, लेकिन यदि मुख्य () मौजूद है, तो इसे लागू किया जा सकता है।
8. जावा अमूर्त वर्गों के साथ तुलना में, जावा इंटरफेस धीमा हैं क्योंकि इसके लिए अतिरिक्त अप्रत्यक्षता की आवश्यकता होती है।
मुख्य बात यह है कि:
मैं 300 मंजिलों का एक भवन बना रहा हूं
इमारत का खाका इंटरफ़ेस
200 मंजिलों तक निर्मित भवन - आंशिक रूप से पूर्ण --- सार
भवन निर्माण पूरा- कंक्रीट
इंटरफेस
सार
दुर्गाजॉब्स वेबसाइट से लिया गया
आइए इस प्रश्न पर फिर से काम करें:
आपको बताने वाली पहली बात यह है कि 1/1 और 1 * 1 परिणाम एक ही है, लेकिन इसका मतलब यह नहीं है कि गुणा और भाग समान है। जाहिर है, वे कुछ अच्छे संबंध रखते हैं, लेकिन आप दोनों का दिमाग अलग है।
मैं मुख्य अंतरों को इंगित करूंगा, और बाकी को पहले ही समझाया जा चुका है:
सार वर्ग एक वर्ग पदानुक्रम मॉडलिंग के लिए उपयोगी होते हैं। किसी भी आवश्यकता की पहली नज़र में, हम आंशिक रूप से स्पष्ट हैं कि वास्तव में क्या बनाया जाना है, लेकिन हम जानते हैं कि क्या बनाना है। और इसलिए आपके अमूर्त वर्ग आपके आधार वर्ग हैं।
अन्य पदानुक्रम या कक्षाओं को यह बताने के लिए कि क्या मैं करने में सक्षम हूं, इंटरफेसेस उपयोगी हैं। और जब आप कहते हैं कि मैं कुछ करने में सक्षम हूं, तो आपके पास वह क्षमता होनी चाहिए। एक ही कार्यशीलता को लागू करने के लिए एक वर्ग के लिए इंटरफेस इसे अनिवार्य के रूप में चिह्नित करेगा।
यह वास्तव में बहुत आसान है।
आप एक ऐसे इंटरफ़ेस के बारे में सोच सकते हैं जो एक वर्ग है जिसे केवल अमूर्त विधियों की अनुमति है और कुछ नहीं।
इसलिए एक इंटरफ़ेस केवल "घोषित" कर सकता है और उस व्यवहार को परिभाषित नहीं कर सकता है जिसे आप चाहते हैं कि कक्षा हो।
एक अमूर्त वर्ग आपको दोनों घोषित करने की अनुमति देता है (अमूर्त विधियों का उपयोग करके) साथ ही परिभाषित (पूर्ण विधि कार्यान्वयन का उपयोग करके) उस व्यवहार को करें जिसे आप वर्ग के लिए चाहते हैं।
और एक नियमित वर्ग केवल आपको परिभाषित करने की अनुमति देता है, घोषित नहीं करता है, जिस व्यवहार / क्रिया को आप वर्ग के लिए चाहते हैं।
एक अंतिम बात,
जावा में, आप कई इंटरफेस को लागू कर सकते हैं, लेकिन आप केवल एक (सार वर्ग या कक्षा) का विस्तार कर सकते हैं ...
इसका मतलब यह है कि परिभाषित व्यवहार की विरासत केवल एक प्रति वर्ग को अनुमति देने के लिए प्रतिबंधित है ... यानी यदि आप एक वर्ग चाहते थे जो कक्षा ए, बी और सी से व्यवहार समझाया गया था, तो आपको निम्न कार्य करने की आवश्यकता होगी: कक्षा ए का विस्तार बी, कक्षा सी का विस्तार ए .. इसके बारे में एक दौर की एक बिट कई विरासत है ...
दूसरी ओर इंटरफेस, आप बस कर सकते हैं: इंटरफ़ेस सी लागू करता है ए, बी
तो प्रभाव में जावा केवल "घोषित व्यवहार" यानी इंटरफेस में कई विरासत का समर्थन करता है, और परिभाषित व्यवहार के साथ केवल एक ही विरासत है .. जब तक आप मेरे द्वारा वर्णित तरीके के बारे में गोल नहीं करते हैं ...
उम्मीद है कि समझ में आता है।
इंटरफ़ेस बनाम अमूर्त वर्ग की तुलना गलत है। इसके बजाय दो अन्य तुलनाएँ होनी चाहिए: 1) इंटरफ़ेस बनाम वर्ग और 2) सार बनाम अंतिम वर्ग ।
इंटरफ़ेस दो वस्तुओं के बीच एक अनुबंध है। जैसे, मैं एक डाकिया हूँ और आप एक पैकेज देने के लिए हो। मुझे उम्मीद है कि आपको अपना डिलीवरी पता पता होगा। जब कोई मुझे पैकेज देता है, तो उसे इसका पता पता होना चाहिए:
interface Package {
String address();
}
क्लास वस्तुओं का एक समूह है जो अनुबंध का पालन करता है। उदाहरण के लिए, मैं "बॉक्स" समूह से एक बॉक्स हूं और मैं पोस्टमैन द्वारा आवश्यक अनुबंध का पालन करता हूं। उसी समय मैं अन्य अनुबंधों का पालन करता हूं:
class Box implements Package, Property {
@Override
String address() {
return "5th Street, New York, NY";
}
@Override
Human owner() {
// this method is part of another contract
}
}
सार वर्ग अपूर्ण वस्तुओं का समूह है। उनका उपयोग नहीं किया जा सकता है, क्योंकि वे कुछ हिस्सों को याद करते हैं। उदाहरण के लिए, मैं एक अमूर्त GPS- जागरूक बॉक्स हूं - मुझे पता है कि मैं नक्शे पर अपनी स्थिति कैसे जांच सकता हूं:
abstract class GpsBox implements Package {
@Override
public abstract String address();
protected Coordinates whereAmI() {
// connect to GPS and return my current position
}
}
यह वर्ग, यदि अन्य वर्ग द्वारा विरासत में मिला / बढ़ाया गया है, तो बहुत उपयोगी हो सकता है। लेकिन अपने आप से - यह बेकार है, क्योंकि इसमें ऑब्जेक्ट नहीं हो सकते। सार वर्ग अंतिम कक्षाओं के तत्वों का निर्माण कर सकते हैं।
अंतिम श्रेणी पूर्ण वस्तुओं का एक समूह है, जिसका उपयोग किया जा सकता है, लेकिन संशोधित नहीं किया जा सकता है। उन्हें पता है कि कैसे काम करना है और क्या करना है। जैसे, मैं एक बॉक्स हूँ जो हमेशा अपने निर्माण के दौरान निर्दिष्ट पते पर जाता है:
final class DirectBox implements Package {
private final String to;
public DirectBox(String addr) {
this.to = addr;
}
@Override
public String address() {
return this.to;
}
}
ज्यादातर भाषाओं में, जावा या सी ++ की तरह, यह सिर्फ एक वर्ग के लिए संभव है , न तो सार और न ही अंतिम। इस तरह के एक वर्ग को विरासत में दिया जा सकता है और उसे तत्काल बनाया जा सकता है। मुझे नहीं लगता कि यह वस्तु-उन्मुख प्रतिमान के अनुरूप है।
फिर से, अमूर्त वर्गों के साथ इंटरफेस की तुलना करना सही नहीं है।
संक्षेप में अंतर निम्नलिखित हैं:
इंटरफ़ेस और सार वर्ग के बीच सिंथेटिक अंतर :
अब इंटरफेस में:
public static
- समर्थित
public abstract
- समर्थित
public default
- समर्थित
private static
- समर्थित
private abstract
- संकलन त्रुटि
private default
- संकलन त्रुटि
private
- समर्थित
अंतर केवल इतना है कि व्यक्ति कई उत्तराधिकार में भाग ले सकता है और अन्य नहीं।
एक इंटरफ़ेस की परिभाषा समय के साथ बदल गई है। क्या आपको लगता है कि एक इंटरफ़ेस में केवल विधि घोषणाएं हैं और सिर्फ अनुबंध हैं? स्थैतिक अंतिम चर के बारे में और जावा 8 के बाद डिफ़ॉल्ट परिभाषा के बारे में क्या?
जावा को कई विरासत के साथ हीरे की समस्या के कारण इंटरफेस शुरू किया गया था और यही वे वास्तव में करने का इरादा रखते हैं।
इंटरफेस वे निर्माण हैं जो कई विरासत की समस्या के साथ दूर करने के लिए बनाए गए थे और इसमें सार विधियां, डिफ़ॉल्ट परिभाषाएं और स्थिर अंतिम चर हो सकते हैं।
यदि आपके पास कुछ सामान्य विधियां हैं जिनका उपयोग कई वर्गों द्वारा किया जा सकता है तो वे अमूर्त कक्षाओं के लिए जाते हैं। यदि आप चाहते हैं कि कक्षाएं कुछ निश्चित खाका का पालन करें तो इंटरफेस के लिए जाएं।
निम्नलिखित उदाहरण इसे प्रदर्शित करते हैं।
जावा में सार वर्ग:
abstract class animals
{
// They all love to eat. So let's implement them for everybody
void eat()
{
System.out.println("Eating...");
}
// The make different sounds. They will provide their own implementation.
abstract void sound();
}
class dog extends animals
{
void sound()
{
System.out.println("Woof Woof");
}
}
class cat extends animals
{
void sound()
{
System.out.println("Meoww");
}
}
जावा में इंटरफ़ेस का कार्यान्वयन निम्नलिखित है:
interface Shape
{
void display();
double area();
}
class Rectangle implements Shape
{
int length, width;
Rectangle(int length, int width)
{
this.length = length;
this.width = width;
}
@Override
public void display()
{
System.out.println("****\n* *\n* *\n****");
}
@Override
public double area()
{
return (double)(length*width);
}
}
class Circle implements Shape
{
double pi = 3.14;
int radius;
Circle(int radius)
{
this.radius = radius;
}
@Override
public void display()
{
System.out.println("O"); // :P
}
@Override
public double area()
{
return (double)((pi*radius*radius)/2);
}
}
संक्षेप में कुछ महत्वपूर्ण मुख्य बातें:
जावा इंटरफ़ेस में घोषित चर डिफ़ॉल्ट अंतिम रूप से होते हैं। अमूर्त वर्गों में गैर-अंतिम चर हो सकते हैं।
जावा इंटरफ़ेस में घोषित चर डिफ़ॉल्ट स्थैतिक द्वारा होते हैं। सार वर्ग में गैर-स्थैतिक चर हो सकते हैं।
जावा इंटरफ़ेस के सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं। एक जावा अमूर्त वर्ग में कक्षा के सदस्यों के सामान्य स्वाद जैसे निजी, संरक्षित, आदि हो सकते हैं।
कई कनिष्ठ डेवलपर्स इंटरफेस, अमूर्त और ठोस वर्गों को एक ही चीज़ के थोड़े बदलाव के रूप में सोचने की गलती करते हैं, और उनमें से एक को विशुद्ध रूप से तकनीकी आधार पर चुनते हैं: क्या मुझे कई विरासत चाहिए? क्या मुझे सामान्य तरीके लगाने के लिए कुछ जगह की आवश्यकता है? क्या मुझे सिर्फ एक ठोस वर्ग के अलावा किसी और चीज़ से परेशान होने की ज़रूरत है? यह गलत है, और इन सवालों में छिपा हुआ मुख्य समस्या है: "मैं" । जब आप अपने लिए, अपने आप से कोड लिखते हैं, तो आप शायद ही कभी अपने कोड के साथ या उसके साथ काम करने वाले अन्य वर्तमान या भविष्य के डेवलपर्स के बारे में सोचते हैं।
इंटरफेस और अमूर्त वर्ग, हालांकि स्पष्ट रूप से तकनीकी दृष्टिकोण से समान है, इसके पूरी तरह से अलग अर्थ और उद्देश्य हैं।
एक इंटरफेस एक अनुबंध को परिभाषित करता है कि कुछ कार्यान्वयन पूरा करेगा आप के लिए ।
एक अमूर्त वर्ग एक डिफ़ॉल्ट व्यवहार प्रदान करता है जिसे आपका कार्यान्वयन पुन: उपयोग कर सकता है।
एक ठोस वर्ग वास्तविक कार्य बहुत विशिष्ट तरीके से करता है। उदाहरण के लिए, ArrayList
एक कॉम्पैक्ट तरीके से वस्तुओं की एक सूची को स्टोर करने के लिए मेमोरी के एक सन्निहित क्षेत्र का उपयोग करता है जो तेजी से यादृच्छिक अभिगम, पुनरावृत्ति, और इन-प्लेस परिवर्तन प्रदान करता है, लेकिन सम्मिलन, विलोपन और कभी-कभी जोड़ भी भयानक है; इस बीच, LinkedList
वस्तुओं की सूची को स्टोर करने के लिए डबल-लिंक्ड नोड्स का उपयोग करता है, जो इसके बजाय तेजी से पुनरावृत्ति, इन-प्लेस परिवर्तन और सम्मिलन / विलोपन / जोड़ प्रदान करता है, लेकिन यादृच्छिक पहुंच पर भयानक है। इन दो प्रकार की सूचियों को विभिन्न उपयोग मामलों के लिए अनुकूलित किया जाता है, और यह बहुत मायने रखता है कि आप उनका उपयोग कैसे करने जा रहे हैं। जब आप उस सूची से प्रदर्शन को निचोड़ने की कोशिश कर रहे हों, जिसके साथ आप बहुत अधिक बातचीत कर रहे हों, और जब सूची का प्रकार आप पर निर्भर हो, तो आपको सावधानीपूर्वक चुनना चाहिए कि आप किसका चयन कर रहे हैं।
दूसरी ओर, किसी सूची के उच्च स्तरीय उपयोगकर्ताओं को वास्तव में परवाह नहीं है कि यह वास्तव में कैसे लागू किया जाता है, और उन्हें इन विवरणों से अछूता होना चाहिए। आइए कल्पना करें कि जावा ने List
इंटरफ़ेस को उजागर नहीं किया था , लेकिन केवल एक ठोस List
वर्ग था जो वास्तव में LinkedList
अभी है। सभी जावा डेवलपर्स ने कार्यान्वयन विवरण को फिट करने के लिए अपने कोड को अनुकूलित किया होगा: रैंडम एक्सेस से बचें, एक्सेस को तेज करने के लिए कैश जोड़ें, या बस ArrayList
अपने आप पर पुन: लागू करें , हालांकि यह अन्य सभी कोड के साथ असंगत होगा जो वास्तव में List
केवल साथ काम करता है । यह भयानक होगा ... लेकिन अब कल्पना कीजिए कि जावा स्वामी वास्तव में महसूस करते हैं कि एक लिंक की गई सूची अधिकांश वास्तविक उपयोग के मामलों के लिए भयानक है, और केवल उनके लिए एक सरणी सूची में बदलने का फैसला किया है।List
कक्षा उपलब्ध है। यह दुनिया के हर जावा कार्यक्रम के प्रदर्शन को प्रभावित करेगा, और लोग इसके बारे में खुश नहीं होंगे। और मुख्य अपराधी यह है कि कार्यान्वयन विवरण उपलब्ध थे, और डेवलपर्स ने मान लिया कि वे विवरण एक स्थायी अनुबंध हैं, जिस पर वे भरोसा कर सकते हैं। यही कारण है कि कार्यान्वयन विवरणों को छिपाना महत्वपूर्ण है, और केवल एक सार अनुबंध को परिभाषित करना है। यह एक इंटरफ़ेस का उद्देश्य है: परिभाषित करें कि किस तरह के इनपुट को एक विधि स्वीकार करती है, और किस तरह के आउटपुट की उम्मीद है, बिना उन सभी हिम्मत को उजागर करने के जो प्रोग्रामर को अपने कोड को ट्विस्ट करने के लिए आंतरिक विवरण फिट करने के लिए भविष्य के किसी भी अपडेट के साथ बदल सकते हैं। ।
एक अमूर्त वर्ग इंटरफेस और कंक्रीट कक्षाओं के बीच में है। यह कार्यान्वयन को सामान्य या बोरिंग कोड साझा करने में सहायता करने वाला है। उदाहरण के लिए, आकार के आधार पर AbstractCollection
मूल कार्यान्वयन प्रदान करता isEmpty
है 0, contains
पुनरावृति के addAll
रूप में , तुलना की जाती है, दोहराया जाता है add
, और इसी तरह। यह कार्यान्वयन को उन महत्वपूर्ण भागों पर ध्यान केंद्रित करने देता है जो उनके बीच अंतर करते हैं: वास्तव में डेटा को कैसे संग्रहीत और पुनर्प्राप्त करें।
कोड के विभिन्न भागों के बीच इंटरफेस कम-सह- प्रवेश द्वार हैं । वे पुस्तकालयों को अस्तित्व में लाने की अनुमति देते हैं और प्रत्येक पुस्तकालय उपयोगकर्ता को तोड़ने के बिना विकसित होते हैं जब कुछ आंतरिक रूप से बदलता है। इसे एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस कहा जाता है , न कि एप्लिकेशन प्रोग्रामिंग क्लासेस। छोटे पैमाने पर, वे कई डेवलपर्स को अच्छी तरह से प्रलेखित इंटरफेस के माध्यम से अलग-अलग मॉड्यूल को अलग करके, बड़े पैमाने पर परियोजनाओं में सफलतापूर्वक सहयोग करने की अनुमति देते हैं।
अमूर्त कक्षाएं उच्च-सामंजस्य सहायकों का उपयोग किया जाता है, जब इंटरफ़ेस को लागू करने के लिए, कार्यान्वयन के विवरण के कुछ स्तर पर विचार किया जाता है। वैकल्पिक रूप से, एसपीआई, सेवा प्रदाता इंटरफेस को परिभाषित करने के लिए अमूर्त कक्षाओं का उपयोग किया जाता है।
एक एपीआई और एक एसपीआई के बीच अंतर सूक्ष्म, लेकिन महत्वपूर्ण है: एक एपीआई के लिए, ध्यान केंद्रित है कि कौन इसका उपयोग करता है, और एक एसपीआई के लिए ध्यान उस पर है जो इसे लागू करता है।
एक एपीआई के तरीकों को जोड़ना आसान है, एपीआई के सभी मौजूदा उपयोगकर्ता अभी भी संकलन करेंगे। एसपीआई के तरीकों को जोड़ना कठिन है, क्योंकि प्रत्येक सेवा प्रदाता (ठोस कार्यान्वयन) को नए तरीकों को लागू करना होगा। यदि SPI को परिभाषित करने के लिए इंटरफेस का उपयोग किया जाता है, तो जब भी SPI अनुबंध बदलता है, एक प्रदाता को एक नया संस्करण जारी करना होगा। यदि इसके बजाय अमूर्त कक्षाओं का उपयोग किया जाता है, तो नए तरीकों को या तो मौजूदा सार विधियों के रूप में परिभाषित किया जा सकता है, या खाली throw not implemented exception
स्टब्स के रूप में , जो कम से कम एक सेवा कार्यान्वयन के पुराने संस्करण को अभी भी संकलित करने और चलाने के लिए अनुमति देगा।
हालाँकि जावा 8 ने इंटरफेस के लिए डिफ़ॉल्ट तरीके पेश किए, जो इंटरफेस और अमूर्त वर्गों के बीच की रेखा को भी धुंधला बना देता है, ऐसा इसलिए नहीं था कि कार्यान्वयन कोड का पुन: उपयोग कर सकते हैं, बल्कि एक एपीआई और एक एसपीआई के रूप में सेवा करने वाले इंटरफेस को बदलना आसान बना सकते हैं। (या गलत तरीके से अमूर्त वर्गों के बजाय SPIs को परिभाषित करने के लिए उपयोग किया जाता है)।
एक कोरोलरी: दूसरी तरह के आस-पास अक्सर गलत तरीके से किया जाता है: किसी चीज़ का उपयोग करते समय , हमेशा सबसे सामान्य वर्ग / इंटरफ़ेस का उपयोग करने की कोशिश करें जो आपको वास्तव में चाहिए। दूसरे शब्दों में, अपने चर को घोषित न करें ArrayList theList = new ArrayList()
, जब तक कि आपके पास वास्तव में एक सरणी सूची होने के नाते इस पर बहुत मजबूत निर्भरता न हो, और कोई अन्य प्रकार की सूची आपके लिए इसे नहीं काटेगी। List theList = new ArrayList
इसके बजाय का उपयोग करें , या भले Collection theCollection = new ArrayList
ही तथ्य यह है कि यह एक सूची है, और किसी भी अन्य प्रकार का संग्रह वास्तव में मायने नहीं रखता है।
वास्तव में मूल प्रश्न का उत्तर नहीं है, लेकिन एक बार जब आपके पास उनके बीच के अंतर का उत्तर होगा, तो आप कब-से-उपयोग-प्रत्येक दुविधा में प्रवेश करेंगे: कब इंटरफेस या अमूर्त कक्षाओं का उपयोग करें? दोनों का उपयोग कब करें?
मुझे OOP का ज्ञान सीमित है, लेकिन व्याकरण में एक विशेषण के बराबर के रूप में इंटरफेस को देखकर मेरे लिए अब तक काम किया है (मुझे सही करें अगर यह विधि फर्जी है!)। उदाहरण के लिए, इंटरफ़ेस नाम उन विशेषताओं या क्षमताओं की तरह हैं जिन्हें आप किसी कक्षा को दे सकते हैं, और एक कक्षा में उनमें से कई हो सकते हैं: ISerializable, ICountable, IList, ICacheable, IHappy, ...
वंशानुक्रम का उपयोग दो उद्देश्यों के लिए किया जाता है:
किसी ऑब्जेक्ट को पेरेंट-टाइप डेटा सदस्यों और पद्धति के कार्यान्वयन के संबंध में अनुमति देने के लिए।
एक प्रकार की वस्तुओं के संदर्भ को कोड द्वारा उपयोग किए जाने की अनुमति देने के लिए जो सुपरपेप्ट ऑब्जेक्ट के संदर्भ की अपेक्षा करता है।
उन भाषाओं / चौखटों में जो सामान्यीकृत विरासत का समर्थन करते हैं, अक्सर एक प्रकार को "इंटरफ़ेस" या "अमूर्त वर्ग" के रूप में वर्गीकृत करने की बहुत कम आवश्यकता होती है। लोकप्रिय भाषाएं और रूपरेखाएं, हालांकि, एक प्रकार के डेटा सदस्यों या विधि कार्यान्वयन को अपने स्वयं के रूप में मानने की अनुमति देंगे, भले ही वे एक प्रकार को अन्य प्रकार की मनमानी संख्या के लिए प्रतिस्थापित करने की अनुमति दें।
सार वर्ग में डेटा सदस्य और विधि कार्यान्वयन हो सकते हैं, लेकिन केवल उन वर्गों द्वारा विरासत में प्राप्त किया जा सकता है जो किसी अन्य वर्ग से विरासत में नहीं आते हैं। इंटरफेस उन प्रकारों पर लगभग कोई प्रतिबंध नहीं लगाते हैं जो उन्हें लागू करते हैं, लेकिन किसी भी डेटा सदस्य या विधि कार्यान्वयन को शामिल नहीं कर सकते हैं।
ऐसे समय होते हैं जब यह कई अलग-अलग चीजों के प्रतिस्थापन के लिए उपयोगी होते हैं; ऐसे समय होते हैं जब ऑब्जेक्ट्स के लिए पैरेंट-टाइप डेटा मेंबर्स और मेथड इम्प्लीमेंटेशन को अपने लिए उपयोगी मानते हैं। इंटरफेस और अमूर्त वर्गों के बीच अंतर करना उन क्षमताओं में से प्रत्येक को उन मामलों में उपयोग करने की अनुमति देता है जहां यह सबसे अधिक प्रासंगिक है।
प्रमुख बिंदु:
लाभ:
यहाँ विवरण प्राप्त करें ... http://pradeepatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops/
इसे योग करने का सबसे छोटा तरीका interface
है:
default
और static
तरीकों से; जबकि इसके default
और static
तरीकों के लिए परिभाषाएँ (विधि हस्ताक्षर + कार्यान्वयन) हैं , इसमें केवल अन्य विधियों के लिए घोषणाएँ (विधि हस्ताक्षर) हैं।interface
एस को लागू कर सकता है , और interface
कई interface
एस से विरासत में मिल सकता है )। सभी चर स्पष्ट रूप से स्थिर हैं, चाहे वे निर्दिष्ट हों public static final
या नहीं। सभी सदस्यों को स्पष्ट public
रूप से बताया गया है कि क्या इस तरह के रूप में निर्दिष्ट किया गया है या नहीं।इस बीच, एक abstract
वर्ग है:
abstract
तरीकों की प्रवृत्ति के साथ । के रूप में चिह्नित घोषणाओं के साथ घोषणा और परिभाषा दोनों हो सकते हैं abstract
।protected
, private
या निजी पैकेज (अनिर्दिष्ट)।या, अगर हम इसे एक ही वाक्य में सभी को उबालना चाहते हैं: एक तो interface
यह है कि कार्यान्वयन वर्ग के पास क्या है , लेकिन एक abstract
वर्ग वह है जो उपवर्ग है ।
मैं एक और अंतर जोड़ना चाहूंगा जो समझ में आता है। उदाहरण के लिए, आपके पास कोड की हजारों लाइनों के साथ एक रूपरेखा है। अब यदि आप एक विधि संवर्द्धन () का उपयोग करके कोड भर में एक नई सुविधा जोड़ना चाहते हैं, तो इंटरफ़ेस में उस पद्धति को अमूर्त वर्ग में जोड़ना बेहतर है। क्योंकि, यदि आप एक इंटरफ़ेस में इस विधि को जोड़ते हैं, तो आपको इसे सभी कार्यान्वित वर्ग में लागू करना चाहिए लेकिन यदि आप सार वर्ग में विधि जोड़ते हैं तो ऐसा नहीं है।
एक सरल लेकिन स्पष्ट जवाब देने के लिए, यह संदर्भ निर्धारित करने में मदद करता है: आप दोनों का उपयोग तब करते हैं जब आप पूर्ण कार्यान्वयन प्रदान नहीं करना चाहते हैं।
एक मुख्य अंतर यह है कि एक इंटरफ़ेस का कोई कार्यान्वयन नहीं है (केवल एक निकाय के बिना तरीके) जबकि अमूर्त वर्ग में एक शरीर के साथ सदस्य और तरीके हो सकते हैं, अर्थात आंशिक रूप से लागू किया जा सकता है।
default
जावा 8 में कीवर्ड को ध्यान में नहीं रखता है, जिसके साथ आप इंटरफेस में ठोस तरीकों को भी परिभाषित कर सकते हैं।
वास्तविक कार्यान्वयन की ओर से अमूर्त वर्ग और इंटरफ़ेस के बीच अंतर।
इंटरफ़ेस : यह एक कीवर्ड है और इसका उपयोग किसी ऑब्जेक्ट के टेम्पलेट या ब्लू प्रिंट को परिभाषित करने के लिए किया जाता है और यह सभी उप-वर्गों को एक ही प्रोटोटाइप का पालन करने के लिए मजबूर करता है, जैसा कि कार्यान्वयन के लिए है, सभी उप-वर्ग कार्यक्षमता के अनुसार कार्य करने के लिए स्वतंत्र हैं इसकी आवश्यकता है।
कुछ अन्य उपयोग के मामले जहां हमें इंटरफ़ेस का उपयोग करना चाहिए।
इंटरफेस के माध्यम से दो बाहरी वस्तुओं (हमारे आवेदन में तीसरे पक्ष के एकीकरण) के बीच संचार यहां इंटरफ़ेस अनुबंध के रूप में काम करता है।
अमूर्त वर्ग: सार, यह एक कीवर्ड है और जब हम किसी भी वर्ग से पहले इस कीवर्ड का उपयोग करते हैं तो यह अमूर्त वर्ग बन जाता है। इसका उपयोग मुख्य रूप से तब किया जाता है जब हमें टेम्पलेट को परिभाषित करने की आवश्यकता होती है और साथ ही साथ किसी ऑब्जेक्ट की कुछ डिफ़ॉल्ट कार्यक्षमता को परिभाषित करना होता है। उप-वर्ग और इस तरह यह निरर्थक कोड और एक और उपयोग के मामलों को हटा देता है जहां हम अमूर्त वर्ग का उपयोग कर सकते हैं , जैसे कि हम चाहते हैं कि कोई अन्य वर्ग सीधे कक्षा के किसी ऑब्जेक्ट को तुरंत हटा न सके , केवल व्युत्पन्न वर्ग ही कार्यक्षमता का उपयोग कर सकते हैं।
सार वर्ग का उदाहरण:
public abstract class DesireCar
{
//It is an abstract method that defines the prototype.
public abstract void Color();
// It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels.
// and hence no need to define this in all the sub classes in this way it saves the code duplicasy
public void Wheel() {
Console.WriteLine("Car has four wheel");
}
}
**Here is the sub classes:**
public class DesireCar1 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red color Desire car");
}
}
public class DesireCar2 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red white Desire car");
}
}
इंटरफ़ेस का उदाहरण:
public interface IShape
{
// Defines the prototype(template)
void Draw();
}
// All the sub classes follow the same template but implementation can be different.
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Circle");
}
}
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Rectangle");
}
}
आप इंटरफ़ेस और अमूर्त वर्ग के बीच स्पष्ट अंतर पा सकते हैं ।
इंटरफेस
सार वर्ग
अमूर्त वर्ग में अमूर्त और गैर-सार तरीके शामिल हैं।
अमूर्त वर्ग विरासत में मिलने पर सभी तरीकों को लागू करने के लिए उपयोगकर्ताओं को मजबूर नहीं करता है।
इसमें आदिम और गैर-आदिम सहित सभी प्रकार के चर शामिल हैं
अमूर्त कीवर्ड का उपयोग करने की घोषणा करें।
एक सार वर्ग के तरीकों और सदस्यों को किसी भी दृश्यता के साथ परिभाषित किया जा सकता है।
एक बच्चा वर्ग केवल एकल वर्ग (अमूर्त या ठोस) का विस्तार कर सकता है।
एक अमूर्त वर्ग एक ऐसा वर्ग है जिसका ऑब्जेक्ट नहीं बनाया जा सकता है या एक ऐसा वर्ग जिसे तत्काल नहीं बनाया जा सकता है। एक अमूर्त विधि एक वर्ग को अमूर्त बनाती है। अमूर्त वर्ग को उन विधियों को ओवरराइड करने की आवश्यकता होती है जो अमूर्त वर्ग में घोषित की जाती हैं। पहुँच विवरण पर कोई प्रतिबंध नहीं। एक अमूर्त वर्ग में कंस्ट्रक्टर और अन्य ठोस (गैर एब्स्ट्रैक्ट तरीके) तरीके हो सकते हैं लेकिन इंटरफ़ेस नहीं हो सकता है।
एक इंटरफ़ेस विधियों का एक खाका / टेम्पलेट है। (उदाहरण के लिए, एक पेपर पर एक घर दिया गया है (इंटरफ़ेस हाउस) और विभिन्न आर्किटेक्ट इसे बनाने के लिए अपने विचारों का उपयोग करेंगे (आर्किटेक्ट्स के वर्ग जो घर के इंटरफ़ेस को लागू करते हैं)। यह एक संग्रह है। अमूर्त विधियाँ, डिफ़ॉल्ट विधियाँ, स्थिर विधियाँ, अंतिम चर और नेस्टेड वर्ग। सभी सदस्य या तो अंतिम या सार्वजनिक होंगे, संरक्षित और निजी अभिगम विनिर्माताओं को अनुमति नहीं दी जाएगी। किसी भी वस्तु के निर्माण की अनुमति नहीं है। उपयोग करने के लिए एक वर्ग बनाना होगा। इंटरफ़ेस लागू करना और इंटरफ़ेस में घोषित अमूर्त विधि को भी ओवरराइड करना। एक इंटरफ़ेस ढीले युग्मन (डायनामिक पॉलीमॉर्फिज्म / डायनेमिक बाइंडिंग) का एक अच्छा उदाहरण है। एक इंटरफ़ेस पॉलिमॉर्फ़िज्म और एब्सट्रैक्शन को लागू करता है। यह बताता है कि क्या करना है लेकिन इसे कैसे परिभाषित किया जाता है। लागू करने के लिए वर्ग। उदाहरण के लिए। 'सा कार कंपनी और यह चाहती है कि कुछ विशेषताएं सभी कार के लिए समान हों जो कि वह निर्माण कर रही हैं ताकि कंपनी एक इंटरफेस वाहन बना सके, जिसमें वे विशेषताएं होंगी और कार के विभिन्न वर्ग (जैसे मारुति सुजुकी, मारुति 800) ओवरराइड करेंगे उन सुविधाओं (कार्यों)।
क्यों इंटरफ़ेस जब हम पहले से ही सार वर्ग है? जावा केवल बहुस्तरीय और पदानुक्रम विरासत का समर्थन करता है, लेकिन इंटरफ़ेस की सहायता से हम कई विरासत को लागू कर सकते हैं।
व्यावहारिकता के संदर्भ में (जेएवीए), अमूर्त वर्ग और इंटरफ़ेस के बीच का मुख्य अंतर है सार वर्ग राज्य को धारण कर सकता है। राज्य को संभालने के अलावा, हम इंटरफ़ेस के साथ बाकी संचालन भी प्राप्त कर सकते हैं।
हमारे पास इंटरफ़ेस और अमूर्त वर्ग के बीच विभिन्न संरचनात्मक / वाक्यात्मक अंतर हैं। कुछ और अंतर हैं
[१] परिदृश्य आधारित अंतर :
जब हम उपयोगकर्ता को मूल वर्ग की वस्तु बनाने के लिए प्रतिबंधित करना चाहते हैं, तो सार वर्ग का उपयोग परिदृश्यों में किया जाता है और हमारा मानना है कि भविष्य में और अधिक अमूर्त विधियां जोड़ी जाएंगी।
इंटरफ़ेस का उपयोग तब किया जाना चाहिए जब हम सुनिश्चित हों कि प्रदान करने के लिए कोई और सार विधि नहीं हो सकती है। तब केवल एक इंटरफ़ेस प्रकाशित होता है।
[२] वैचारिक अंतर :
"क्या हमें भविष्य में और अधिक सार तरीके प्रदान करने की आवश्यकता है" यदि हाँ इसे सार वर्ग बनाते हैं और यदि NO इसे इंटरफ़ेस बनाते हैं।
(जावा 1.7 तक सबसे उपयुक्त और मान्य)
आमतौर पर एब्सट्रैक्ट क्लास का इस्तेमाल किसी चीज़ की कोर के लिए किया जाता है लेकिन परिधीय को जोड़ने के लिए इस्तेमाल किया जाने वाला इंटरफ़ेस।
जब आप वाहन के लिए आधार प्रकार बनाना चाहते हैं तो आपको अमूर्त वर्ग का उपयोग करना चाहिए लेकिन यदि आप कुछ कार्यक्षमता या संपत्ति जोड़ना चाहते हैं जो वाहन के आधार अवधारणा का हिस्सा नहीं है, तो आपको इंटरफ़ेस का उपयोग करना चाहिए, उदाहरण के लिए आप "टोज़न ()" फ़ंक्शन जोड़ना चाहते हैं। ।
इंटरफ़ेस में अमूर्त वर्ग के बजाय अमूर्तता की विस्तृत श्रृंखला है। आप इसे पास होने वाले तर्कों में देख सकते हैं। इस उदाहरण को देखें:
यदि आप तर्क के रूप में वाहन का उपयोग करते हैं, तो आप इसके व्युत्पन्न प्रकार (बस या कार-समान श्रेणी-बस वाहन श्रेणी) का उपयोग कर सकते हैं। लेकिन जब आप तर्क के रूप में उपयोग करने योग्य इंटरफ़ेस का उपयोग करते हैं तो आपके पास अधिक विकल्प होते हैं।