2009-10-26 7 views
10

Tengo una clase A y escribo una subclase B. A tiene solo un constructor que está parametrizado. B tiene que llamar a este super constructor de A. Ahora quiero usar un Objeto como parámetro. Este objeto debe llamar a un método de B. Entonces, el objeto-parámetro debe contener una referencia de B o debe ser una clase interna.¿Haciendo referencia a "esto" al invocar a un superconstructor?

public B(){ 
    super.(new parameter(this)) 
} 

Ahora cuando quiero invocar el constructor como ... Eclipse dice:

no puede referirse a 'esto' ni 'super' mientras se invoca explícitamente un constructor

El Lo único que veo para eludir esto, es un método set, para inyectar el "this" -instance en el objeto parámetro. No me gustaría editar la superclase.

¿Ve alguna manera mejor de evitar esto?

+0

¿De qué * idioma * estás hablando? –

+11

vea la etiqueta Jonathan ... its java – craftsman

Respuesta

17

El compilador realmente le impide dispararse en el pie aquí. B no está completamente construido hasta después de la llamada al superconstructor, por lo que si pasa esto (si el compilador lo permitió) como referencia, y llama a un método en B, B estaría en un estado inválido y causaría todo tipo de problemas desagradables (de hecho, A aún no está inicializado, ni ninguna clase en la cadena, incluido Object).

La solución obvia es proporcionar la funcionalidad fuera de B y pasarla al constructor del parámetro. Las soluciones específicas dependerán del problema específico, pero una clase anidada estática dentro de B (debe ser estática por la misma razón, una clase interna tiene una referencia implícita a la instancia de clase externa) podría proporcionar esa funcionalidad, tal vez. Tal vez necesites replantear la relación entre el parámetro, B y su superclase. Todo depende del caso.

+0

Sé cómo solucionarlo. El problema real es que la superclase es un código "viejo". Lo estoy reutilizando en un contexto un poco diferente. Estaba buscando una solución elegante. Pero creo que no hay. El es el precio por reutilizar el código anterior. –

+2

Podría simplemente componerlo, colocando la nueva clase como un envoltorio alrededor del anterior. ¿La clase anterior implementa una interfaz que puede implementar con su nuevo objeto? – Joe

+1

@ c0d3x, podría publicar su solución (en otra pregunta) y preguntar si hay una solución más elegante. Ver su solución respondería muchas preguntas sobre el caso específico involucrado. – Yishai

Cuestiones relacionadas