2012-10-20 11 views
10

संभव डुप्लिकेट:
What does it mean to “program to an interface”?
Interface vs Abstract Class (general OO)जावा इंटरफेस के बारे में उलझन

मैं जावा जानने के लिए नया हूँ और अब मैं इंटरफ़ेस के बारे में संदेह में हूँ। मैंने कई सामग्रियों की खोज की है और पढ़ा है लेकिन अभी भी स्पष्ट नहीं है।

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

लेकिन मुझे इंटरफ़ेस का अर्थ नहीं पता है। interface a है, और यदि class B इंटरफ़ेस को कार्यान्वित करने जा रहा है, तो इसे आरक्षित शब्द class B implements a का उपयोग करना होगा, और उसके बाद इंटरफ़ेस की सभी विधियों को पूरा करना होगा। लेकिन मेरा सवाल यह है कि, यदि कक्षा बी को अपने सभी तरीकों को पूरा करना है, तो इंटरफ़ेस का अर्थ क्या है? मुझे लगता है कि हमें इसकी आवश्यकता नहीं है। मुझे यह बहुत समझ में नहीं आता है। मैंने कई वाक्य पढ़े जैसे: "इंटरफ़ेस ऑब्जेक्ट उन्मुख भाषा के मूल विचार को प्रतिबिंबित कर सकता है", "इंटरफ़ेस प्रोग्राम को आसान बनाने में मदद कर सकता है" और इसी तरह। लेकिन मैं वास्तव में अर्थ समझ नहीं सकता।

तो, क्या कोई मुझे इंटरफ़ेस समझने के लिए कुछ उदाहरण दिखा सकता है? या आप मुझे कुछ उपयोगी लिंक या किताबें बता सकते हैं जो इंटरफ़ेस का स्पष्ट रूप से वर्णन करते हैं। मैं वास्तव में इसे समझने की उम्मीद करता हूं। धन्यवाद!

+0

यह जावा में इंटरफेस के बारे में आपको और अधिक जानने में मदद कर सकता है: http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – Jimmy

+0

एकमात्र उद्देश्य इंटरफ़ेस * सार्वजनिक रूप से परिभाषित प्रोटोकॉल व्यवहार प्राप्त करने के लिए है * जिसका अर्थ है कि इंटरफ़ेस को प्राप्त करने वाले वर्ग को उस इंटरफ़ेस द्वारा परिभाषित सभी विधियों को शामिल करना आवश्यक है, विशेष रूप से यह उस वर्ग के लिए प्रोटोकॉल परिभाषा * है। (एक इंटरफेस के भीतर परिभाषित हर चीज वैसे भी सार्वजनिक होनी चाहिए)। – Lion

उत्तर

7

मान लीजिए आप एक Car वर्ग और Vegetable वर्ग जो वास्तविक जीवन में कोई संबंध नहीं है और वहाँ एक सामान्य व्यवहार है wash() कहा जाता है। क्योंकि हम एक कार धो सकते हैं और एक सब्जी भी धो सकते हैं। लेकिन एक कार धोना और एक सब्जी धोना पूरी तरह से अलग प्रक्रिया/व्यवहार है।

पूर्व के लिए: Car को अपने रसोई सिंक के नीचे एक पावर पंप, Vegetables से धोया जाना चाहिए। तो धोने का तरीका अलग है। इसलिए आप वाशिंग प्रक्रिया को wash() इंटरफेस में Washable कहते हैं और आप उन्हें Car और Vegetable कक्षा दोनों में लागू करते हैं।

interface Washable { 

public void wash(); 

} 

public class Car implements Washable { 

public void wash() { 

    // wash the car with a power pump 

} 


} 

public class Vegetable implements Washable { 

public void wash() { 

    // wash the vegetable under a kitchen sink 

} 


} 

एक व्यक्ति के रूप में, आप एक कार के साथ-साथ सब्जी धोना चाहेंगे।

public class Person { 


Washable washableObject = new Car(); 

washableObject.wash(); 

washableObject = new Vegetable(); 

washableObject.wash(); 




} 
  1. तो इंटरफ़ेस एक तरह से असंबंधित वर्ग है जो एक आम है behavior.But व्यवहार अलग ढंग से लागू किया जाएगा या भविष्य में बदला जा सकता है कनेक्ट करने के लिए है।

  2. एक दिन आप एक कार धोने के तरीके को बदलने का फैसला करते हैं। मान लें कि आपने "कार वॉशिंग मशीन" खरीदी है। तो Car कक्षा में विधि wash() के अंदर कार्यान्वयन परिवर्तन।

    सार्वजनिक वर्ग कार को लागू करता है धो सकते हैं {

    public void wash() { 
    
        // wash the car with my new car washing machine !! 
    
    } 
    

    }

लेकिन एक व्यक्ति के रूप में, आप अभी भी wash() विधि कॉल। जिस तरह से wash() विधि लागू की जा रही है (कार को अपनी नई कार वाशिंग मशीन से धोना), इस कार्यान्वयन परिवर्तन ने आपके Person कक्षा को प्रभावित नहीं किया है।

आशा है कि आप स्पष्ट हैं कि हम अब interfaces का उपयोग क्यों करते हैं।

+0

बढ़िया! यह ज्वलंत और स्पष्ट है! धन्यवाद! – lkkeepmoving

+0

हाँ, बहुत स्पष्ट और समझने में आसान है। पर क्यों? मुझे कोई फायदा नहीं दिख रहा है। आप जानते हैं कि आप एक कार धो रहे हैं क्योंकि आपने इसे एक नई कार() के रूप में तुरंत चालू कर दिया है। आप केवल वॉशबल नामक एक अभिभावक वर्ग प्राप्त कर सकते हैं, धो लें() सार, और दोनों कार और सब्जियां धोने योग्य से प्राप्त होती हैं, धोने के अपने संस्करण को लागू करती हैं()। मैं क्या खो रहा हूँ? –

+1

@ScottBiggs कल्पना कीजिए कि आपके पास एक विधि है SuperWashMachine एक विधि washAll() के साथ। यह धोने योग्य एक सरणी प्राप्त करता है। आपको केवल सरणी के माध्यम से जाने और धोने() विधि को कॉल करने की आवश्यकता है क्योंकि "अनुबंध" कहता है कि किसी भी वर्ग को लागू करने वाला वॉशबल जानता है कि इसे कैसे किया जाए। यही है, इस विधि को किसी भी कार, सब्जी या जो भी विशिष्ट वर्ग के बारे में जानने की आवश्यकता नहीं है, यह सिर्फ धोने योग्य चीजों से संबंधित है। विरासत का उपयोग क्यों नहीं? खैर, शायद यह कुछ अर्थपूर्ण है। आम तौर पर एक आम पिता वर्ग के साथ "एक" संबंध स्थापित करने के लिए धोने योग्य होने के अलावा एक कार और एक सब्जी को आम तौर पर अधिक होना चाहिए। –

1

असल में, interface वास्तव में ऐसा करने के बिना एकाधिक विरासत को पूरा करने का एक तरीका है। (जो यह नहीं कहना है कि जावा लोग "बाहर निकल गए" - एकाधिक विरासत बहुत गन्दा और कार्यान्वित करने में अक्षम है।)

इसका क्या अर्थ है कि आपके पास दो अलग-अलग अलग-अलग वर्ग ए और बी हो सकते हैं, बिना किसी सामान्य के Object के अलावा पूर्वजों, और, यदि वे एक ही interface को लागू करते हैं, तो आप एक दूसरे के लिए प्रतिस्थापित कर सकते हैं (जब तक आप इंटरफ़ेस में केवल विधियों का संदर्भ लें)।

+0

अपूर्ण, लेकिन यहां सबसे अच्छा जवाब। –

1

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

+0

@Ravn खराब शब्द xD क्षमा करें। फिक्स्ड। –

1

मान लीजिए कि आप वर्ग विरासत को समझते हैं, मुझे एक कंकाल वर्ग की तरह एक इंटरफ़ेस के बारे में लगता है, जहां एक वर्ग की संरचना का वर्णन किया गया है लेकिन वास्तव में लिखा/कार्यान्वित नहीं किया गया है।

एक और वर्ग तब किसी भी वर्ग के साथ काम कर सकता है जो किसी विशेष इंटरफ़ेस को लागू करता है भले ही इसे अभी तक लागू नहीं किया गया हो।

उदाहरण के लिए, कोई Animal नामक इंटरफ़ेस बना सकता है। इसकी विधियां शायद: Talk(), Walk() और Eat()। आप कक्षा लिख ​​सकते हैं जो Animal लागू करता है जो Talk() विधि कहलाता है जब "woof" प्रिंट करता है। इसलिए एक और कक्षा को पता चलेगा कि पशु इंटरफेस को लागू करने वाले सभी वर्गों के साथ कैसे काम करना है।

युपीडी

एक अच्छा असली दुनिया उदाहरण JDBC डाटाबेस वक्तव्य इंटरफ़ेस है। यह कई आवश्यक गुण सेट करता है जिन्हें डेटाबेस निर्माता को लागू करना होगा, जैसे कि execute(String sql)। ओरेकल इसे पोस्टग्रेस्क्ल से अलग तरीके से कार्यान्वित करेगा। यह डेटाबेस को किसी अन्य के लिए स्वैप करने की अनुमति देता है लेकिन उपयोगकर्ता कोड वही रहता है।

1

इंटरफ़ेस और कक्षा को समझने के लिए एक सरल कोड।

import java.util.List; 
import java.util.ArrayList; 
public class Q01 { 
List<Shape> shapes= new ArrayList(); 

public void add() { 
    shapes.add(new Square(3.0)); 
    shapes.add(new Circle(2.0)); 
} 
public void print() { 
    for (int i = 0; i < shapes.size(); i++) { 
     Shape shape = shapes.get(i); 
     System.out.println(shape.getClass().getSimpleName() + " --->" + shape.getArea()); 
    } 
} 

public static void main(String[] args) { 
    Q01 q01= new Q01(); 
    q01.add(); 
    q01.print(); 
} 

public interface Shape { 
    double getArea(); 
} 

public class Square implements Shape{ 
    private double edge; 

    public Square(double edge) { 
     this.edge = edge; 
    } 
    public double getArea() { 
     return edge*edge; 
    } 
} 
public class Circle implements Shape{ 
    private double radius; 

    public Circle(double radius) { 
     this.radius = radius; 
    } 

    public double getArea() { 
     return 3.14 * radius * radius; 
    } 
} 
} 
+0

Q01 कक्षा में, "सूची आकार = नया ArrayList();" "सूची " होना चाहिए? क्यूं कर? – lkkeepmoving

+0

क्योंकि, हम बिल्कुल नहीं जानते कि इसका किस प्रकार का है। यह सर्कल या वर्ग हो सकता है? – chrome

+0

समझ गया, धन्यवाद! – lkkeepmoving

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