2010-06-15 9 views
21

मैं एक आंतरिक कक्षा के लिए एक कन्स्ट्रक्टर लिखने के बारे में कैसे जाउंगा जो इंटरफ़ेस को कार्यान्वित कर रहा है? मैं जानता हूँ कि मैं एक पूरी नई वर्ग बना सकता है, लेकिन मैं समझ वहाँ इस की रेखा के साथ कुछ करने के लिए एक तरह से हो गया है: जब मैं में प्रवेश इस यह एक निर्माता के रूप में AbstractAction विधि को न पहचानेआंतरिक कक्षाओं में कार्यान्वयन (इंटरफेस लागू करना)

JButton b = new JButton(new AbstractAction() { 

    public AbstractAction() { 
     super("This is a button");       
    } 


    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

(संकलक वापसी प्रकार के लिए पूछता है)। क्या किसी को कुछ पता है?

+6

जब आप अज्ञात आंतरिक कक्षाओं की सीमा तक पहुंच सकते हैं, तो यह एक मजबूत संकेत है कि आपको इसके बजाय एक सामान्य आंतरिक कक्षा लिखनी चाहिए। –

उत्तर

35

बस विस्तारित वर्ग के नाम के बाद पैरामीटर डाल:

JButton b = new JButton(new AbstractAction("This is a button") { 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

इसके अलावा, आप एक प्रारंभ ब्लॉक का उपयोग कर सकते हैं:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Write initialization code here (as if it is inside a no-arg constructor) 
     setLabel("This is a button") 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 
+0

मेरे प्रश्न का पूरी तरह उत्तर देते हैं, धन्यवाद! – thepandaatemyface

4

जिसके परिणामस्वरूप वर्ग प्रकार AbstractAction की नहीं है, लेकिन कुछ की (अनामित, अज्ञात) प्रकार जो AbstractAction को बढ़ाता/लागू करता है। इसलिए इस अज्ञात वर्ग के लिए एक निर्माता को यह 'अज्ञात' नाम होना चाहिए, लेकिन AbstractAction नहीं।

यह सामान्य एक्सटेंशन/कार्यान्वयन की तरह है: यदि आप एक class House extends Building को परिभाषित करने और एक House का निर्माण आप निर्माता House और नहीं Building (या AbstractAction बस वापस मूल प्रश्न के com करने के लिए) का नाम दें।

9

तुम सच में जो भी कारण के लिए एक contructor की जरूरत है, तो आप एक प्रारंभ ब्लॉक का उपयोग कर सकते हैं:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
}); 

लेकिन तुम वहाँ से एक सुपर वर्ग निर्माता फोन नहीं कर सकते हैं। जैसा कि इटै ने कहा था, आप केवल उस तर्क को पार कर सकते हैं जिसे आप कॉल में चाहते हैं।

निजी तौर पर

हालांकि, मैं इस के लिए एक नया भीतरी वर्ग बनाना होगा:

private class MyAction extends AbstractAction { 

    public MyAction() { 
     super("This is a button."); 
    } 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("button clicked"); 
    } 
} 

तो:

JButton b = new JButton(new MyAction()); 
1

कारण संकलक शिकायत कर रहा है है, क्योंकि आप के अंदर एक निर्माता घोषित करने के लिए कोशिश कर रहे हैं अपने गुमनाम वर्ग, जिसे अज्ञात कक्षाओं के लिए अनुमति नहीं है। दूसरों की तरह कहा है, आप या तो एक इंस्टेंस प्रारंभकर्ता का उपयोग करके या इसे गैर-अज्ञात वर्ग में परिवर्तित करके हल कर सकते हैं, ताकि आप इसके लिए एक कन्स्ट्रक्टर लिख सकें।