2011-05-17 17 views
19

En Java, ¿puedo forzar de algún modo a una clase que extiende una clase abstracta a implementar su constructor con un Object como parámetro?java force una clase que se extiende

Algo así como

public abstract class Points { 

    //add some abstract method to force constructor to have object. 
} 

public class ExtendPoints extends Points { 

    /** 
    * I want the abstract class to force this implementation to have 
    * a constructor with an object in it? 
    * @param o 
    */ 
    public ExtendPoints(Object o){ 

    } 
} 

Respuesta

26

Se puede utilizar un constructor con un parámetro en su clase abstracta (que sea protegida si desea permitir que dis-subclases anónimos).

public abstract class Points{ 
    protected Points(Something parameter){ 
     // do something with parameter 
    } 
} 

Haciendo eso, forzar la clase que implementa tener un constructor explícito, ya que debe llamar a la super constructor con un parámetro.

Sin embargo, no puede obligar a la clase superior a tener un constructor con parámetros. Que siempre se puede falsificar el parámetro de la siguiente manera:

public class ExtendPoints extends Points{ 
    public ExtendPoints(){ 
     super(something); 
    } 
} 
2

No hay constructores no se heredan, por lo que cada clase tiene que proporcionar su propia, a menos que no se especifica un constructor y obtener el valor por defecto sin argumentos constructor.

0

Si agrega un constructor public Points(Object o) {} a Puntos, fuerza a cualquier constructor de subclase a llamar a ese superconstructor. Sin embargo, no creo que no haya forma de garantizar que las subclases usen esa firma exacta de constructor.

5

Como dijeron otros antes, la firma de Constructores no se puede aplicar, pero puede aplicar un conjunto particular de argumentos usando el patrón AbstractFactory. Luego puede definir los métodos de creación de su interfaz de fábrica para tener una firma particular.

-1

EDITAR

Bueno, no, no es posible forzar la ejecución de un constructor con argumentos.

2

Probablemente allí no es posible en tiempo de compilación, pero se puede utilizar la reflexión para comprobar en tiempo de ejecución si el constructor deseado se declaró:

public abstract class Points { 

    protected Points() { 
     try { 

      Constructor<? extends Points> constructor = 
       getClass().getDeclaredConstructor(Object.class); 
      if (!Modifier.isPublic(constructor.getModifiers())) 
       throw new NoSuchMethodError("constructor not public"); 

     } catch (SecurityException ex) { 
      throw new RuntimeException(ex); 
     } catch (NoSuchMethodException ex) { 
      throw (NoSuchMethodError) new NoSuchMethodError().initCause(ex); 
     } 
    } 
} 
Cuestiones relacionadas