je suis en train de suivre les cours et je suis à la partie "héritage" et il y a quelque chose que je n'arrive pas à comprendre :
- je créé un objet avec des variables (par exemple int valObjet). Je lui fais aussi un constructeur par défaut et un avec paramètre.
- depuis le "main" je peux modifier ces valeurs en faisant par exemple : objet.valObjet = 0; ça marche car j'ai laissé mes variables sans mettre private ou protected.
- ensuite je met justement le mot private devant ma déclaration de la variable (private int valObjet). Là effectivement je ne peux plus exécuter la commande objet.valObjet = 0; je dois bien passer par accesseurs pour modifier mes valeurs (elles sont protégées).
- ensuite je veux créer un objet hérité du premier. Je dois donc déclarer les variables du premier objet en : protected int valObjet (comme dit dans le cours) afin de faire fonctionner l'objet enfant.
- sauf que là (depuis le main) je me rend compte que je peux à nouveau faire la commande objet.valObjet = 0; (sans utiliser d'accesseur donc) ce qui veut dire que mes variables de l'objet ne sont plus protégées.
Quelqu'un peut-il me dire si j'ai oublié quelque chose?
Pas de modificateur d'accès = accès "package". La variable est accessible par toutes les classes du même package.
protected = accès "package" + classes dérivées. La variable est accessible par toutes les classes du même package et toutes les classes filles.
En général, il est recommandé de mettre toutes les variables d'instance en private contrairement à ce que dit le cours. Le fait de donner accès direct à la variable par les classes filles peut leur permettre de potentiellement corrompre le fonctionnement de la classe mère et causer des bugs en cascade.
> En gros vous me conseillez de laisser les variables de la classe mère enprivate?
Dans toutes les classes.
> Cela veut dire que je ne peux plus instancier mes objets hérités (à moins d'utiliser des mutateurs)
Bien sûr que si. Et si tu as besoin d'initialiser les variables de la classe mère, tu peux utiliser son constructeur.
class Rectangle {
private int largeur;
private int hauteur;
public Rectangle(int l, int h) {
largeur = l;
hauteur = h;
}
}
class Carre extends Rectangle {
public Carre(int cote) {
super(cote, cote);
}
}
Après, c'est la classe mère qui se charge de gérer ses propres variables. La classe fille interagit avec sa classe mère uniquement avec les méthodes héritées.
Non, d'un point de vue mathématique c'est bien carré qui hérite de rectangle.
NicolasFernandes1 a écrit:
Il est vrai qu'en mathématique le carré est un rectangle spécifique (longueur = largeur).
Le point de vue mathématique n'a pas vraiment son mot à dire concernant le respect du LSP par des classes. Typiquement ici :
brubru777 a écrit:
En quoi mon exemple viole-t-il le LSP ?
Il ne le viole pas parce que les classes en question ne définissent pas de service. Pas de méthodes de dialogue => pas de contrat => pas de LSP. Mais bon du coup, elles n'ont plus trop de sens en tant que classe.
Il ne faut pas perdre de vue que les notions de classes et d'héritage n'ont de sens qu'en présence de la notion de service, et que le reste du temps, ça n'a pas de sens d'en causer.
Le propos de mon exemple, c'était juste pour dire que les mutateurs (en général surutilisés et à éviter autant que possible) ne sont pas nécessaires pour initialiser des variables private dans une classe-mère. Après, je suis d'accord que mes classes "ne font rien". C'était pour illustrer un point de détail "technique".
Et comme je l'ai dit ensuite
> Après, c'est la classe mère qui se charge de gérer ses propres variables. La classe fille interagit avec sa classe mère uniquement avec les méthodes héritées.
Ok, pour le cas particulier de ton exemple il n'y a pas de violation.
Besoin d'explication public, private, protected
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C