2011-07-19 11 views
5

La situación es que quiero heredar un objeto de tener una interfaz constructor más limpio:La herencia de una clase con argumentos de constructor en Java

class BaseClass { 
    public BaseClass(SomeObject object){ 
     ... 
    } 
} 

class SubClass extends BaseClass{ 
    private SubObject subObject = new SubObject(); 
    public SubClass(){ 
     super(new SomeObject(subObject)); // doesn't compile 
    } 
} 

Pero para hacer eso tengo que hacer las cosas antes de que el constructor como en el ejemplo arriba pero no puede porque Java no permite eso. ¿Hay alguna forma de evitar esto? Estoy empezando a sentir que si su clase está diseñada para ser subclasificada, siempre debe implementar un constructor predeterminado y proporcionarles los valores que necesita. A veces puede salirse con la suya si crea un nuevo objeto directamente en el superconstructor. como argumento, pero si necesita una referencia al objeto que ha creado, entonces es una manguera.

+1

¿Cuál es el error de compilación que obtienes? –

+0

no se puede hacer referencia a subObject antes de que se haya llamado supertype – palto

+0

* No se puede hacer referencia a un campo de instancia subObject al invocar explícitamente un constructor * –

Respuesta

4

necesita cambiar para que usted no está haciendo referencia a un miembro de instancia en la llamada superconstructor. Desafortunadamente, si necesita "guardar" el SubObject, se vuelve complicado. Creo que tendrías que hacerlo con el encadenamiento de constructores:

class SubClass extends BaseClass{ 
    private SubObject subObject; 

    public SubClass() { 
     this(new SubObject()); 
    } 

    private SubClass(SubObject subObject) { 
     super(new SomeObject(subObject)); 
     this.subObject = subObject; 
    } 
} 
0
public SubClass(){ 
    super(new SomeObject(new SubObject())); // this should compile 
} 

En su superclase, hacer algo como esto:

private final SomeObject foo; 
public BaseClass(SomeObject foo){ 
    this.foo = foo; 
} 
public /* or protected */ SomeObject getFoo(){return this.foo;} 
+0

No se puede hacer referencia al SubObject de esa manera – palto

+1

'super' toma' SomeObject' como parámetro no 'SubObject' –

+0

Eso es correcto, pero puede obtenerlo de la superclase a través de un programa de acceso, ver mi actualización –

0

No es exactamente una respuesta ya que no tendría ningún SubClass, pero se puede usar una fábrica.

public BaseClassFactory { 
    public static BaseClass newBaseClass() { 
     // init some object 
     // ... 
     return new BaseClass(someObject); 
    } 
} 
Cuestiones relacionadas