2011-05-09 13 views
25

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

class A { 
    interface B {} 
} 

interface D { 
    class E {} 
} 
+1

देखें http://stackoverflow.com/questions/2400828/inner-class-within-interface –

उत्तर

21

यह मैं कॉपी करने और कुछ लिंक से चिपकाने हूँ (मैं पहले किया था और आपके साथ साझा) हो सकता है कि आप थोड़ा कर सकते हैं।

1)

interface employee{ 
class Role{ 
     public String rolename; 
     public int roleId; 
} 
Role getRole(); 
// other methods 
} 

ऊपर इंटरफ़ेस में आप भूमिका कर्मचारी इंटरफेस (employee.Role) करने के लिए दृढ़ता से टाइप बाध्यकारी हैं। 2) एक इंटरफ़ेस के अंदर एक स्थिर वर्ग के साथ आपके पास एक सामान्य प्रोग्रामिंग खंड को कम करने की संभावना है: यह जांचना कि कोई ऑब्जेक्ट इंटरफ़ेस का उदाहरण है, और यदि ऐसा है तो इस इंटरफ़ेस की विधि को कॉल करना। बजाय ऐसा करने का

public interface Printable { 
    void print(); 

    public static class Caller { 
     public static void print(Object mightBePrintable) { 
       if (mightBePrintable instanceof Printable) { 
         ((Printable) mightBePrintable).print(); 
       } 
     } 
    } 
} 

अब: इस उदाहरण को देखो

void genericPrintMethod(Object obj) { 
    if (obj instanceof Printable) { 
     ((Printable) obj).print(); 
    } 
} 

आप लिख सकते हैं:

void genericPrintMethod(Object obj) { 
     Printable.Caller.print(obj); 
    } 
5

संगठन।

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

मैंने वास्तव में केवल इंटरफ़ेस के अंदर एक इंटरफ़ेस के अंदर एक वर्ग का पैटर्न देखा है और इंटरफ़ेस के साथ जाने के लिए एक समेकित प्रकार प्रदान करने के लिए नीचे - क्योंकि इंटरफ़ेस केवल कक्षा का उपयोग कर सकता है, और कक्षा को संरक्षित किया जा सकता है , इंटरफ़ेस का उपयोग करने वाले क्लाइंट केवल इंटरफ़ेस में परिभाषित कक्षा के उदाहरणों को समेकित मानों के रूप में स्वीकार कर सकते हैं। यह केवल एकमात्र उदाहरण है जिसके साथ मैं आ सकता हूं - मुझे यकीन है कि अन्य मौजूद हैं, लेकिन यह दुर्लभ है कि मैं एक इंटरफ़ेस के अंदर एक कक्षा को देखता हूं।

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

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

+0

मुझे लगता है कि कुछ कोड टुकड़े यहां सहायक हो सकते हैं। –

+0

मुझे लगता है कि http://stackoverflow.com/a/10481539/1083704 – Val

1

यदि किसी भी वर्ग की कार्यक्षमता उस स्थिति में किसी भी इंटरफेस के साथ निकटता से संबद्ध है तो हम एक इंटरफ़ेस के अंदर एक कक्षा घोषित करते हैं।

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

0

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

+0

में कोई उदाहरण दिया गया था, यह सच नहीं है, हम बिना किसी कार्यान्वयन के आंतरिक कक्षाओं तक पहुंच सकते हैं - 'InterfaceName.ClassName a = new InterfaceName.ClassName (); a.print (10), ' –

3

यदि कक्षा की कार्यक्षमता किसी इंटरफ़ेस से निकटता से जुड़ी हुई है और हम कहीं भी उस कक्षा का उपयोग नहीं करेंगे तो हम एक इंटरफेस के अंदर एक कक्षा को परिभाषित कर सकते हैं।

package PracticeTest; 

public interface VehicleService { 
    public void repair(Vehicle v); 
    public class Vehicle{ 
     String vehicleModel; 
     String vehicleNumber; 
     public Vehicle(String vehicleModel, String vehicleNumber) { 
     super(); 
     this.vehicleModel = vehicleModel; 
     this.vehicleNumber = vehicleNumber; 
     } 

    } 
} 

उपरोक्त मामले में वाहन कक्षा वाहन सेवा के लिए उपलब्ध है और हम इसे कहीं और उपयोग नहीं कर रहे हैं।

  1. एक अंतरफलक के डिफ़ॉल्ट कार्यान्वयन प्रदान करने के लिए हम एक अंतरफलक

इंटरफ़ेस

package PracticeTest; 

public interface VehicleService { 
public void repair(); 
public class DefaultVehicle implements VehicleService{ 

    @Override 
    public void repair() {   
     System.out.println(" Default Repair"); 
    } 
} 

कार्यान्वयन कक्षा

अंदर एक वर्ग को परिभाषित कर सकते हैं
package PracticeTest; 
public class busRepair implements VehicleService{ 

    @Override 
    public void repair() { 
     System.out.println(" Bus Repair"); 
    } 
    public static void main(String args[]){ 
     busRepair b = new busRepair(); 
     b.repair(); 
     DefaultVehicle d = new DefaultVehicle(); 
     d.repair(); 
    } 
} 
संबंधित मुद्दे