2011-11-17 14 views
32

में दो इंटरफेस को लागू करें मैं दो इंटरफेस है:एक अनाम वर्ग

interface A { 
    void foo(); 
} 

interface B { 
    void bar(); 
} 

मैं तो जैसे इन इंटरफेस के दोनों को लागू करने कक्षाओं की अनाम उदाहरण बना करने में सक्षम हूँ:

new A() { 
    void foo() {} 
} 

या:

new B() { 
    void bar() {} 
} 

मैं एक अज्ञात वर्ग बनाना चाहता हूं जो दोनों इंटरफेस लागू करता है। की तरह कुछ (काल्पनिक): "बी एक प्रकार का संकल्प नहीं किया जा सकता":

new A implements B { 
    void foo() {} 
    void bar() {} 
} 

यह स्पष्ट रूप से एक संकलन त्रुटि देता है।

वैकल्पिक हल काफी सरल है:

class Aggregate implements A, B { 
    void foo() {} 
    void bar() {} 
} 

मैं तो Aggregate जहां कभी मैं गुमनाम वर्ग का इस्तेमाल किया है | का उपयोग करें।

मैं सोच रहा था कि क्या यह एक अज्ञात वर्ग के लिए दो इंटरफेस लागू करने के लिए कानूनी भी है।

+0

देखें [क्यों-एक-अज्ञात-वर्ग-कैंट-कार्यान्वयन-एकाधिक-इंटरफेस-सीधे] (http://stackoverflow.com/questions/4774168/why-an-anonymous-class-cant-implement- बहु- इंटरफेस-सीधे) – nawfal

उत्तर

52

"एक अनाम भीतरी वर्ग एक उपवर्ग विस्तार कर सकते हैं या एक इंटरफ़ेस को लागू। गैर-अनाम वर्गों (भीतरी या अन्यथा) के विपरीत, एक गुमनाम भीतरी वर्ग दोनों नहीं कर सकते। दूसरे शब्दों में, यह नहीं कर सकते दोनों एक वर्ग का विस्तार करने और एक इंटरफ़ेस को लागू, न ही यह एक से अधिक इंटरफ़ेस को लागू कर सकते हैं। "(http://scjp.wikidot.com/nested-classes)

7

के लिए कुछ कीस्ट्रोक्स को बचाने (उदाहरण के लिए यदि इंटरफेस तरीकों में से एक बहुत कुछ है) आप उपयोग कर सकते

abstract class Aggregate implements A,B{ 
} 

new MyObject extends Aggregate{ 
    void foo(){} 
    void bar(){} 
} 

सूचना कुंजी घोषित करना है सार

+12

एक और विकल्प कुल मिलाकर एक इंटरफ़ेस बनाना है: 'इंटरफ़ेस कुल ए, बी {} 'बढ़ाता है। –

+7

यह किस भाषा में संकलित है? – nachokk

+2

जावा में, उदाहरण के लिए? –

13

आप ऐसा करने के निर्धारित कर रहे हैं, तो आप एक तिहाई इंटरफेस की घोषणा कर सकता है, सी के रूप में कुल योग:

public interface C extends A, B { 
} 

इस तरह, आप एक ही गुमनाम आंतरिक वर्ग, के एक कार्यान्वयन है जो घोषणा कर सकते हैं सी

एक पूरा उदाहरण लग सकता है जैसे:

public class MyClass { 

    public interface A { 
    void foo(); 
    } 

    public interface B { 
    void bar(); 
    } 

    public interface C extends A, B { 
    void baz(); 
    } 

    public void doIt(C c) { 
    c.foo(); 
    c.bar(); 
    c.baz(); 
    } 

    public static void main(String[] args) { 
    MyClass mc = new MyClass(); 

    mc.doIt(new C() { 
     @Override 
     public void foo() { 
     System.out.println("foo()"); 
     } 

     @Override 
     public void bar() { 
     System.out.println("bar()"); 
     } 

     @Override 
     public void baz() { 
     System.out.println("baz()"); 
     } 
    }); 
    } 

} 

इस उदाहरण के उत्पादन में है:

foo() 
bar() 
baz() 
0

ध्यान दें कि आप एक नामित स्थानीय वर्ग बना सकते हैं कि दो इंटरफेस को लागू:

void method() { 
    class Aggregate implements A, B { 
     void foo() {} 
     void bar() {} 
    } 

    A a = new Aggregate(); 
    B b = new Aggregate(); 
} 

यह एक वर्ग-स्तर या उच्च-स्तरीय वर्ग घोषणा करने से आप को बचाने के लिए।

परिणाम को local class कहा जाता है। उदाहरण विधियों में घोषित स्थानीय वर्ग भी आंतरिक कक्षाएं हैं, जिसका अर्थ है कि वे युक्त ऑब्जेक्ट उदाहरण का संदर्भ दे सकते हैं।

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