2012-08-13 26 views
23

Angenommen, ich eine Klasse A ohne Verlängerung haben:eine Funktion außer Kraft setzen, die Klasse

public class A { 
    public A(){....} 
    public void method1() {...} 
}; 

Und eine Instanz dieser Klasse:

A anA = new A(); 

Gibt es eine Möglichkeit, die method1() nur für anA außer Kraft zu setzen? Diese Frage entsteht, wenn ich ein kleines Malprogramm schreibe, in dem ich die Klasse JPanel mehrmals erweitern muss, nur um kleinere Änderungen an den verschiedenen Panels vorzunehmen, die leicht unterschiedliche Eigenschaften haben. dass myA in diesem Fall mit Ausnahme

private static class myA extends A { 
    public void method1() { 
     ... 
    } 
} 

A anA = new myA(); 

nur wiederverwendet werden kann: als

A anA = new A() { 
    public void method1() { 
     ... 
    } 
}; 

Dies ist das gleiche:

Antwort

46

Sie können folgende tun. Das ist mit anonymen Klassen nicht möglich.

+14

Wahr, aber technisch ist dies eine anonyme Klasse, die die Klasse A erweitert. –

+0

@StephenC In der Tat. Ich habe die Antwort aktualisiert. Danke für das Aufzeigen. – jensgram

+0

@jensgram Das könnte spät sein, aber vielen Dank. –

13

Sie können eine neue anonyme Klasse im laufenden Betrieb, so lange erstellen, wie Sie die No-arg Konstruktor Ihrer Klasse verwenden A:

A anA = new A() { 

    @Override 
    public void method1() { 
    ... 
    } 
}; 

Beachten Sie, dass, was Sie tun möchten, ist sehr nah an was ist bekannt als Lambda, die mit dem nächsten Release 8 von Java SE kommen sollte.

2

Ich mag diese Art von Sache mit einem Delegaten oder "Strategie-Muster" zu tun.

Verwandte Themen