java force une classe en extension

En Java, puis-je en quelque sorte forcer une classe qui étend une classe abstraite à implémenter son constructeur avec un object comme paramètre?

Quelque chose comme

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){ } } 

Vous pouvez utiliser un constructeur avec un paramètre dans votre classe abstraite (le protéger si vous souhaitez interdire les sous-classes anonymes).

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

Ce faisant, vous forcez la classe d’implémentation à avoir un constructeur explicite, car elle doit appeler le super constructeur avec un paramètre.

Cependant, vous ne pouvez pas forcer la classe remplaçante à avoir un constructeur avec des parameters. Il peut toujours simuler le paramètre comme ceci:

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

Comme d’autres l’ont déjà dit, la signature des constructeurs ne peut pas être appliquée, mais vous pouvez appliquer un ensemble d’arguments particulier à l’aide du modèle AbstractFactory . Ensuite, vous pouvez définir les méthodes de création de votre interface d’usine pour avoir une signature particulière.

Les constructeurs ne sont pas hérités, donc chaque classe doit fournir son propre constructeur, sauf si vous ne spécifiez pas de constructeur et obtenez le constructeur par défaut no args.

Probablement, ce n’est pas possible au moment de la compilation, mais vous pouvez utiliser la reflection pour vérifier au moment de l’exécution si le constructeur souhaité a été déclaré:

 public abstract class Points { protected Points() { try { Constructor 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); } } } 

Si vous ajoutez un constructeur public Points(Object o) {} à Points, vous forcez les constructeurs de sous-classes à appeler ce super constructeur. Cependant, je ne pense pas qu’il soit impossible de s’assurer que les sous-classes utilisent cette signature de constructeur exacte.

MODIFIER

Eh bien non, il n’est pas possible de forcer l’implémentation d’un constructeur avec argument.