OVH Cloud OVH Cloud

héritage de constructeurs

23 réponses
Avatar
LR
Salut,

Je sais que c'est une question triviale mais je pensais que c'était clair et
finalement je reçois une erreur...

J'ai une classe Evaluation avec deux contructeurs : public Evaluation() et
public Evaluation( String content )

J'ai deux sous-classes : ClientEvaluation et WorkerEvaluation.

Je pensais que je n'aurai rien de plus à déclarer dans les sous-classes
concernant les constructeurs, je pensais qu'il seraient hérités de
Evaluation, mais non, j'ai du les déclarer car : "The constructor
ClientEvaluation(String) is undefined"...

Comment ça se fait, les constructeurs ne devraient-ils pas être hérités ?

Merci d'avance
Lilian

10 réponses

1 2 3
Avatar
xav
LR wrote:
Salut,

Je sais que c'est une question triviale mais je pensais que c'était clair et
finalement je reçois une erreur...

J'ai une classe Evaluation avec deux contructeurs : public Evaluation() et
public Evaluation( String content )

J'ai deux sous-classes : ClientEvaluation et WorkerEvaluation.

Je pensais que je n'aurai rien de plus à déclarer dans les sous-classes
concernant les constructeurs, je pensais qu'il seraient hérités de
Evaluation, mais non, j'ai du les déclarer car : "The constructor
ClientEvaluation(String) is undefined"...

Comment ça se fait, les constructeurs ne devraient-ils pas être hérités ?

Merci d'avance
Lilian




Tu peux toujours appeler le constructeur de la classe pere. Si c'est
juste pour récupérer le nom, il faut mettre au moins le prototype et une
paire d'accolades.

Avatar
Stephane Zuckerman
J'ai une classe Evaluation avec deux contructeurs : public Evaluation() et
public Evaluation( String content )

J'ai deux sous-classes : ClientEvaluation et WorkerEvaluation.

Je pensais que je n'aurai rien de plus à déclarer dans les sous-classes
concernant les constructeurs, je pensais qu'il seraient hérités de
Evaluation, mais non, j'ai du les déclarer car : "The constructor
ClientEvaluation(String) is undefined"...

Comment ça se fait, les constructeurs ne devraient-ils pas être hérités ?


Non.

Lorsque j'ai une classe Toto, si je fais new Toto(), il faut bien que la
méthode Toto() existe, et ce, que Toto hérite de Titi ou pas.

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Hervé AGNOUX
LR wrote:


Comment ça se fait, les constructeurs ne devraient-ils pas être hérités ?



Non, pour je ne sais plus quelle raison les constructeurs ne sont pas
hérités. Seul le constructeur par défaut est fourni, s'il n'y a pas
d'autres constructeurs de déclaré.

Donc si tu veux un constructeur acceptant un String en paramètre, il faut le
déclarer dans chaque classe.

--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Kupee
Hervé AGNOUX wrote:
Non, pour je ne sais plus quelle raison les constructeurs ne sont pas
hérités. Seul le constructeur par défaut est fourni, s'il n'y a pas
d'autres constructeurs de déclaré.


Pour un tas de bonnes raisons, on peut avoir une classe avec 10
constructeurs et dire qu'une des sous classes en a que 3 et qui prennent
en plus pas les mêmes paramètres. Ou alors avoir une classe avec un un
constructeur prenant une String qui est protected et la sousclasse aura
un constructeur prenant une String mais qui sera lui public ...
Ou même avoir un constructeur private qui ne sera pas hérité ni
appelable par la sous classe.
La seule chose est que la sous-classe doit obligatoirement appeler un
constructeur de sa classe mère en premiere ligne de son constructeur (ou
un autre constructeur d'elle même, mais l'autre aura la même
contrainte). Et si on ne le fait pas le constructeur par défaut (sans
paramètres) est appelé, s'il existe (sinon ca compile pas)

Avatar
xav
Kupee wrote:
Hervé AGNOUX wrote:

Non, pour je ne sais plus quelle raison les constructeurs ne sont pas
hérités. Seul le constructeur par défaut est fourni, s'il n'y a pas
d'autres constructeurs de déclaré.



Pour un tas de bonnes raisons, on peut avoir une classe avec 10
constructeurs et dire qu'une des sous classes en a que 3 et qui prennent
en plus pas les mêmes paramètres. Ou alors avoir une classe avec un un
constructeur prenant une String qui est protected et la sousclasse aura
un constructeur prenant une String mais qui sera lui public ...
Ou même avoir un constructeur private qui ne sera pas hérité ni
appelable par la sous classe.
La seule chose est que la sous-classe doit obligatoirement appeler un
constructeur de sa classe mère en premiere ligne de son constructeur (ou
un autre constructeur d'elle même, mais l'autre aura la même
contrainte). Et si on ne le fait pas le constructeur par défaut (sans
paramètres) est appelé, s'il existe (sinon ca compile pas)


A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix arbitraire
ou motivé ?


Avatar
Kupee
xav wrote:
A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix arbitraire
ou motivé ?


C'est un choix de style de codage en fait. Dans Intellij il ne te force pas.
Certains préfèrent etre explicites et mettre le super(); d'autres
pensent que c'est inutile.
Un peu comme certains mettent toujours this. pour accéder aux champs
ou ceux qui déclarent les champs avec leur valeur d'initialisation par
défaut type
private String maString = null;
private int tutu = 0;

Avatar
Arnaud Berger
Bonjour,

Je ne pense pas que super() soit généré par les IDE, mais c'est plutôt le
compilateur
qui génère cet appel automatiquement si aucun appel au constructeur père
n'est déclaré clairement.

Le choix est très motivé puisque le principe même de l'héritage serait
biaisé sans cet appel automatique.

Cordialement

Arnaud




"xav" a écrit dans le message news:
d5vlhn$r7v$
Kupee wrote:
Hervé AGNOUX wrote:

Non, pour je ne sais plus quelle raison les constructeurs ne sont pas
hérités. Seul le constructeur par défaut est fourni, s'il n'y a pas
d'autres constructeurs de déclaré.



Pour un tas de bonnes raisons, on peut avoir une classe avec 10
constructeurs et dire qu'une des sous classes en a que 3 et qui prennent
en plus pas les mêmes paramètres. Ou alors avoir une classe avec un un
constructeur prenant une String qui est protected et la sousclasse aura
un constructeur prenant une String mais qui sera lui public ...
Ou même avoir un constructeur private qui ne sera pas hérité ni
appelable par la sous classe.
La seule chose est que la sous-classe doit obligatoirement appeler un
constructeur de sa classe mère en premiere ligne de son constructeur (ou
un autre constructeur d'elle même, mais l'autre aura la même
contrainte). Et si on ne le fait pas le constructeur par défaut (sans
paramètres) est appelé, s'il existe (sinon ca compile pas)


A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix arbitraire
ou motivé ?




Avatar
Stephane Zuckerman
A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix arbitraire
ou motivé ?


Tu n'es pas obligé d'appeler le constructeur de ta super classe, tout
simplement.

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
xav
Kupee wrote:
xav wrote:

A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix
arbitraire ou motivé ?



C'est un choix de style de codage en fait. Dans Intellij il ne te force
pas.
Certains préfèrent etre explicites et mettre le super(); d'autres
pensent que c'est inutile.
Un peu comme certains mettent toujours this. pour accéder aux champs
ou ceux qui déclarent les champs avec leur valeur d'initialisation par
défaut type
private String maString = null;
private int tutu = 0;


L'éternel dilemme entre la lisibilité et le perfectionnisme :o

Perso, je mets toujours les super et les this. Pour ce qui est des
initialisations, il n'y en a pas 36 possibles, 0 pour les types de bases
ou null pour les objets, je trouve que c'est vraiment enfoncer des
portes grandes ouvertes.


Avatar
Kupee
Stephane Zuckerman wrote:
A ce propos, comment se fait-il que le super() ne soit pas obligatoire
mais généré automatiquement par tous les ide. C'est un choix arbitraire
ou motivé ?



Tu n'es pas obligé d'appeler le constructeur de ta super classe, tout
simplement.


Si tu es OBLIGE de le faire. Seulement le compilateur pour te simplifier
la vie le fait automatiquement, mais ca ne marche qu'a la condition
qu'un constructeur sans paramètres soit disponible


1 2 3