71 votes

Comment puis-je forcer un constructeur à être défini dans toutes les sous-classes de ma classe abstraite ?

J'ai une classe abstraite A qui définit des méthodes abstraites. Cela signifie que, pour qu'une classe soit instanciable, toutes les méthodes abstraites doivent être implémentées.

Je voudrais que toutes mes sous-classes implémentent un constructeur avec 2 ints comme paramètres.

Déclarer un constructeur va à l'encontre de mon objectif, car je veux que le constructeur soit défini dans les sous-classes et je ne sais rien de l'implémentation. De plus, je ne peux pas déclarer un constructeur comme étant abstrait ;

Y a-t-il un moyen de le faire ?

Exemple de ce que je veux :

Disons que je suis en train de définir l'API d'une classe Matrix. Dans mon problème, les matrices ne peuvent pas modifier leurs dimensions.

Pour qu'une matrice soit créée, je dois fournir sa taille.

Par conséquent, je veux que tous mes implémenteurs fournissent au constructeur la taille en tant que paramètre. Ce constructeur est motivé par le problème, et non par un souci d'implémentation. L'implémentation peut en faire ce qu'elle veut, à condition de conserver toute la sémantique des méthodes.

Disons que je veux fournir une implémentation de base de la fonction invert() dans ma classe abstraite. Cette méthode va créer une nouvelle matrice avec this dimensions inversées. Plus précisément, comme il est défini dans la classe abstraite, il créera une nouvelle instance de la même classe en tant que this en utilisant un constructeur qui prend deux ints. Comme il ne connaît pas l'instance, il utilisera la réflexion (getDefinedConstructor) et je veux un moyen de garantir que je l'obtiendrai et que ce sera significatif pour l'implémentation.

0 votes

Une solution élégante peut être trouvée ici : stackoverflow.com/questions/6028526/

-2voto

yesennes Points 301

La classe abstraite doit avoir une méthode abstraite qui prend ce que vous auriez comme paramètres. Par exemple :

public abstract void setSize(int rows,int columns);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X