2012-08-13 24 views
23

Supongamos que tengo una clase A:Anular una función sin extender la clase

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

y una instancia de esa clase:

A anA = new A(); 

¿Hay alguna manera de anular el method1() sólo para anA? Esta pregunta surge cuando escribo un pequeño programa de pintura en el que tengo que extender la clase JPanel varias veces solo para hacer pequeños cambios a los diferentes paneles que tienen características ligeramente diferentes.

Respuesta

46

Usted puede hacer lo siguiente:

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

Esto es lo mismo que:

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

A anA = new myA(); 

Sólo con la excepción de que en este caso myA pueden ser reutilizados. Eso no es posible con clases anónimas.

+14

Cierto, sin embargo técnicamente esto está creando una clase anónima que amplía la clase A. –

+0

@StephenC De hecho. He actualizado la respuesta. Gracias por señalar. – jensgram

+0

@jensgram Esto puede ser tarde, pero muchas gracias. –

13

Se puede crear un una nueva clase anónima sobre la marcha, siempre y cuando se está usando el constructor sin argumentos de la clase A:

A anA = new A() { 

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

Tenga en cuenta que lo que quiere hacer está muy cerca lo que se conoce como lambda, que debería aparecer en la próxima versión 8 de Java SE.

2

Me gusta hacer este tipo de cosas con un delegado, o "patrón de estrategia".

public interface ADelegate { 
    public void method1(); 
} 

public class A { 
    public A(){....} 
    public ADelegate delegate; 
    public final void method1() { delegate.method1(); } 
}; 

A anA = new A(); 
anA.delegate = new ADelegate() { 
    public void method1() { ... } 
}; 
Cuestiones relacionadas