OVH Cloud OVH Cloud

Heritage et surchage de champs

9 réponses
Avatar
xav14
abstract public class Pere {
public int var=1;
...

public class Fils extends Pere {
public final int var=1;
...
}

Est-ce que c'est correct de faire ça ? déconseillé ? mal ?
A priori le abstract n'a pas d'importance mais peut-il en avoir ?


Merci pour les réponse.


@+
Xav14

9 réponses

Avatar
xav14
From: "xav14"
abstract public class Pere {
public int var=1;
...

public class Fils extends Pere {
public final int var=1;
...
}

Est-ce que c'est correct de faire ça ? déconseillé ? mal ?
A priori le abstract n'a pas d'importance mais peut-il en avoir ?


Merci pour les réponse.


@+
Xav14




Pour préciser, en fait j'ai un attribut dans la classe pere qui est variable
et je veux le rendre constant dans une classe dérivée.

Avatar
ryleland
Selon moi je le deconseillerai car si tu fais:

Fils f = new Fils();

System.out.println(f.var); // lequel il va ecrire ? attribut var de Fils ou celui
// du pere...

utilise plutot deux variables de classes dont le nom est different
Avatar
Nicolas Delsaux
Le 22.10 2003, (laurent) s'est levé(e) et s'est dit
"tiens, je vais écrire aux mecs de fr.comp.lang.java"

Selon moi je le deconseillerai car si tu fais:

Fils f = new Fils();

System.out.println(f.var); // lequel il va ecrire ? attribut var de
Fils ou celui
// du pere...


La réponse est assez simple : celle du fils. C'est à ça que sert la
surcharge, très précisément.

utilise plutot deux variables de classes dont le nom est different



C'est aussi ce que je dirais.

--
Nicolas Delsaux
"S'il existe deux ou plusieurs manières de faire quelque chose et que l'une
de ces manières est susceptible de se solder par une catastrophe, on peut
être certain que quelqu'un se débrouillera pour la choisir."
Edward A.Murphy Jr

Avatar
Nicolas Delsaux
Le 22.10 2003, "xav14" s'est levé(e) et s'est dit
"tiens, je vais écrire aux mecs de fr.comp.lang.java"

Pour préciser, en fait j'ai un attribut dans la classe pere qui est
variable et je veux le rendre constant dans une classe dérivée.

Je suppose que tu utilise pour cet attribut des getters et des setters (en

clair une méthode setVar(int newVar) et une méthode getVar()) et que
partout dans tes classes Pere et Fils tu accèdesz à cet attribut par le
biais de ces méthodes ?
Si c'est le cas, tu n'as qu'à surcharger la méthode setVar(int newVar) pour
qu'elle ne fasse rien.
Si ça n'est pas le cas, fais en sorte que ça le soit, ça va grandement te
simplifier la vie (et tu n'auras par ailleurs pas à définir de variable var
final, ce qui de toute façon risque de ne pas marcher, à cause du masquage
des variables).




--
Nicolas Delsaux
"Celui qui sait en quoi consiste l'action humaine nourrit ce que sa
conscience saisit au moyen de ce qu'elle ne saisit pas."
Tchouang-Tseu

Avatar
Kupee
laurent wrote:
Selon moi je le deconseillerai car si tu fais:

Fils f = new Fils();

System.out.println(f.var); // lequel il va ecrire ? attribut var de Fils ou celui
// du pere...

utilise plutot deux variables de classes dont le nom est different


Ca c'est clair, surcharger un champ ca attire que des emmerdes, imagine
que là
System.out.println(f.var) va écrire le champ var du fils, alors que si
on avait fait
Pere p = new Fils();
System.out.println(p.var);
on écrirait celui du père.
Et plus tordu

Fils f = new Fils();
System.out.println(f.var);
System.out.println(((Pere) f).var); écrira sucessivement celui du fils
puis du père

Avatar
Akram
en effet, c est tres mal.
Si tes deux classes n'ont rien en commun pourquoi faire de l'heritage?
pourquoi ne pas créer un autre attribut? as-tu penser à mettre
l'attribut en protected?



xav14 wrote:

From: "xav14"

abstract public class Pere {
public int var=1;
...

public class Fils extends Pere {
public final int var=1;
...
}

Est-ce que c'est correct de faire ça ? déconseillé ? mal ?
A priori le abstract n'a pas d'importance mais peut-il en avoir ?


Merci pour les réponse.


@+
Xav14





Pour préciser, en fait j'ai un attribut dans la classe pere qui est variable
et je veux le rendre constant dans une classe dérivée.





Avatar
xav14
"Akram" a écrit dans le message de
news:bn6tgb$1mq1$
en effet, c est tres mal.
Si tes deux classes n'ont rien en commun pourquoi faire de l'heritage?
pourquoi ne pas créer un autre attribut? as-tu penser à mettre
l'attribut en protected?




J'ai simplifié au maximum pour l'exemple. Elles ont d'autres champs en
commun. Mais la surcharge du setter est la meilleure solution.

Avatar
Vincent Brabant

Ca c'est clair, surcharger un champ ca attire que des emmerdes, imagine
que là
System.out.println(f.var) va écrire le champ var du fils, alors que si
on avait fait
Pere p = new Fils();
System.out.println(p.var);
on écrirait celui du père.
Et plus tordu

Fils f = new Fils();
System.out.println(f.var);
System.out.println(((Pere) f).var); écrira sucessivement celui du fils
puis du père

J'ai eu du mal à le croire lorsque j'ai lu ce code. Mais c'est vrai.

On en apprend tous les jours ici.

Merci.

Vincent

Avatar
Jc Sirot
xav14 wrote:
abstract public class Pere {
public int var=1;
...

public class Fils extends Pere {
public final int var=1;
...
}

Est-ce que c'est correct de faire ça ? déconseillé ? mal ?
A priori le abstract n'a pas d'importance mais peut-il en avoir ?



D'une façon générale il faut toujours essayer d'éviter les champs qui ne
sont pas déclarés private ou public/package static final et utiliser des
methodes get et set pour accéder aux variables d'instance.

--

Cordialement
-- JC Sirot