2010-06-15 16 views
21

Bir arayüz uygulayan bir iç sınıf için bir kurucu yazmayı nasıl yaparım? Ben yepyeni bir sınıf yapabilir biliyorum ama bu hat boyunca bir şey yapmak için bir yolu olmalı var anlamaya: Bu bir yapıcı olarak AbstractAction yöntemini tanımıyor girdiğinizdeİç Derslerde Oluşturucular (arayüzler uygulayarak)

JButton b = new JButton(new AbstractAction() { 

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


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

(derleyici dönüş türü için sorar). Bir fikri olan var mı?

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"); 
    } 
}); 
+6

Anonim iç sınıfların yapabileceği sınırlara ulaştığınızda, bunun yerine normal bir iç sınıf yazmanız gereken güçlü bir ipucu olur. –

cevap

35

Sadece uzatılmış sınıfın adından sonra parametrelerini eklemek AbstractAction'u genişleten/uygulayan (adsız, anonim) bir tür. Bu nedenle, bu anonim bir sınıf için bir kurucunun bu 'bilinmeyen' ismine sahip olması gerekir, ancak AbstractAction.

Normal uzatma/uygulanması gibi: Bir class House extends Building tanımlamak ve yapıcı (sadece geri asıl soruya com için ya AbstractAction) House değil Building isim bir House inşa halinde. Eğer gerçekten herhangi bir nedenle bir contructor gerekiyorsa

+0

sorumu mükemmel bir şekilde yanıtladı, teşekkürler! – thepandaatemyface

4

çıkan sınıf ancak bazı tipine AbstractAction ait değil: Ayrıca

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

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

, bir başlatma bloğu kullanabilirsiniz:

9

, o zaman bir başlatma bloğu kullanabilirsiniz:

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

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

Ama oradan bir süper sınıf kurucusunu çağırmak olamaz. Ancak, Itay'ın dediği gibi, istediğiniz argümanı yeni çağrıya geçirebilirsiniz. Şahsen

olsa, bunun için yeni bir iç sınıf oluşturmak olacaktır: o zaman

private class MyAction extends AbstractAction { 

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

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

: İçinde bir kurucu bildirmek için çalışıyoruz çünkü derleyici şikayet ediyor

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

sebebi senin anonim sınıflar için izin verilmeyen anonim sınıf. Diğerleri de söylediğim gibi, bunu bir örnek başlatıcı kullanarak veya anonim olmayan bir sınıfa dönüştürerek çözebilirsiniz, böylece bunun için bir kurucu yazabilirsiniz.

İlgili konular