Bonjour à tous!
Ayant lu le début de la POO du livre du site du zéro, beaucoup de concepts sont restés flous pour moi...
J'ai ensuite eu cette semaine a peu près les mêmes choses mais en cours(à l'école donc), et je n'ai pas plus compris...
Le problème est que je ne vois pas la différence entre tous les concepts suivants, et j'aimerais donc des explications afin de mieux comprendre les différences entre ceux ci:
- difference entre classe/objet/instance
- difference entre attributs(variables d'instance)/méthodes(méthodes d'instance et accesseurs. Quoique les accesseurs représentent la seule chose que j'ai a peu pres compris)
- différence entre un constructeur et une méthode dans une classe
- Pourquoi utiliser le mot clé this alors qu'on peut simplement mettre la variable sans ce mot clé(quoique je n'ai pas essayé les differents cas)
- Qu'est-ce qu'une variable de classe comparé aux autre variables, et pourquoi doit on les declarer static? (par ailleurs, j'aimerais connaitre la signification et les moments ou utiliser le mot clé static, dans les méthodes comme dans les déclarations de variables)
Merci d'avance pour vos réponses
Déjà je précise que mes exemples seront en C++ comme je ne connais pas le java mais ca a l'air d'être la meme chose excepté la syntaxe peut-être
-Une classe est en quelque sorte la définition d'un objet, la partie du code qui explique au compilateur comment marche un objet.
-Une instance ou un objet sont un peu comme des variables, elles prennent de la taille en mémoire et se comportent comme définies dans leur classe.
-Un attribut c'est juste une variable qui compose une classe, par exemple une classe "image" devrait par exemple contenir des attributs "largeur", "hauteur", etc..
Une méthode, c'est une fonction qui est définie dans la classe, et qu'on utilise à travers un objet (ou à l'intérieur de l'objet). Pour l'image, ce serait par exemple GetPixel(int x, int y) ou Reverse() qui renverserait le sens de l'image.
-Un constructeur EST une méthode, et c'est celle qui est appelé quand tu instancies une classe: si tu crées un objet de type "image", le constructeur va par exemple remplir l'image en noir.
-this permet de récupérer un pointeur sur l'instance de l'objet sur lequel est appelé une méthode. Ca a l'air inutile puisqu'on peut accéder directement aux variables/fonctions sans avoir à préciser l'objet mais ca peut être utile si tu aimes bien préciser que c'est sur l'objet actuel qu'on utilise une fonction par exemple, ou encore si tu dois utiliser un opérateur sur ta classe tu peux faire *this + other;
(ou encore this->operator+(other); voire operator+(other) mais le premier exemple est tout de même plus clair)
-Une variable de classe permet d'avoir non pas une variable pour chaque instance mais une variable pour chaque classe. Un exemple typique ce serait dans notre classe image d'avoir une variable imgCount qui compterait à chaque fois le nombre d'images qu'on utilise dans l'application
Après pour le mot-clef static je laisse quelqu'un d'autre répondre parce que je sais pas ce que ça fait exactement en fait ![]()
D'acc y'a des trucs qui sont maintenant plus clairs, mais il reste quelque chose de flou, et qui m'empeche de comprendre pas mal de truc:
quelle est la différence entre objet et instance?
J'en ai une vision, et je ne sais pas si elle est bonne, donc merci de me corriger au besoin:
pour moi, un objet est donc quelque chose du style une image, ou un monstre en tant qu'ensemble de méthodes etc qui le définissent, tandis qu'une instance est... une création concrète de l'objet en question, et donc par exemple dans un jeu avec des monstres, on a un Objet monstre qui contient la définition de celui ci, et ensuite, sur le terrain, on a 3 Instances de l'objet monstre, et ces instances pourront avoir leur variables modifiées indépendemment les unes des autres alors qu'à la base, elles ont toutes été crées par l'objet monstre...
Je ne sais pas si je suis clair, et pire, si je ne suis pas totalement à coté de la plaque!
==> En gardant l'exemple des monstres, pourrait tu me donner un exemple concret d'utilisation de this et d'une ou deux variables de classe(hormis un compteur de monstres)?
Alors, un objet c'est simplement synonyme d'une instance, toi tu as l'air de plutôt penser qu'un objet est une classe.
Donc dans ta description là, tu remplaces "objet" par "classe" et ce sera juste, sachant que tu peux également remplacer "instance" par "objet"
Ensuite pour un exemple d'utilisation.. Déjà faut savoir qu'on utilise rarement les variables de classes mais voici quelques exemples:
Tu pourrais utiliser une variable de classe où on stockerait la somme des points de vie de chaque monstre, pour montrer où on en est dans l'avancement du nettoyage d'une zone par exemple
Après c'est sûr qu'on les utilise pas souvent, mais faut juste savoir que si un jour t'as besoin d'une variable unique que chaque instance d'une classe pourrait manipuler, ben ce qu'il te faut est une variable de classe
pour this, en général on l'utilise en fait en argument d'une fonction, donc dans le cas du monstre ce serait par exemple de cloner le monstre dans une de tes méthodes:
Monstre monstre2(this);
Si le constructeur de copie par pointeur est défini, ça va te recréer un autre monstre identique à this.
Donc en général tu utilises this quand tu veux utiliser ton objet en ARGUMENT d'une autre fonction.
Tu peux avoir un exemple assez clair d'utilisation de this dans un mutateur : http://pastebin.com/HxFswSFW
Si instance est synonyme d'objet, je ne comprends pas ceci:
"this permet de récupérer un pointeur sur l'instance de l'objet"
l'instance de l'objet voudrait dire l'instance de l'instance ?
Sinon c'est bon.
J'ai toujours quelques difficultés avec this:
dans l'exemple de Toastation, que se passerait il si on remplacait la ligne par maxLife=maxLife ?
Par contre, je n'ai pas compris l'exemple du clonage! (par ailleurs, la notion de pointeur m'est inconnue, donc je ne comprends pas "le constructeur de copie par pointeur")
Si on faisait maxLife = maxLife ça ne ferait rien tout simplement. Tu mets la valeur dans une même valeur.
this.maxLife représente la vie maximum de ton monstre.
maxLife c'est la nouvelle vie maximum que tu veux lui passer, on la passe en paramètre.
Pour le clonage d'une instance c'est ce que Angivare à dit, ça donnerait quelque chose comme ça :
http://pastebin.com/LwBD3fmS
"this permet de récupérer un pointeur sur l'instance de l'objet"
me suis trompé, c'est un pointeur sur l'instance de la classe
Après quand je dis pointeur, en C++ c'est comme ça que this marche exactement, mais en java c'est possible que ça renvoie tout simplement l'objet ou du moins quelque-chose qui permette de le manipuler, quoi ![]()
D'accord pour le maxLife, mais imaginons qu'on remplace this.maxLife=maxLife par autre chose du style maxHP=maxLife, du coup maxHP représentera bien la vie maximale, et pour autant on aura pas mis le mot clé this, non?
Ensuite, pour le code du clone, j'ai beau décortiquer, ca me pose probleme.. Voilà comme je le comprends:
On écrit une fonction cloneMonstre() qui va renvoyer un Monstre.
Ensuite on crée un nouveau Monstre, appelé clone, et il est égal à "this" et c'est particulièrement ça que je ne comprends pas.
Ici, je ne vois pas à quoi correspond le this; pour moi, on dit "Voilà un nouveau Monstre, clone, qui est égal à CECI" et ceci pour moi représente... le vide! Vu qu'on a rien précisé avant
Petite question, est-ce que la fonction cloneMonstre() s'utilise comme ceci:
Monstre squelette = new Monstre(parametres...);
// Modifications intermédiaires, modification de la vie du squelette, ...
Monstre test = squelette.cloneMonstre();
Je ne sais pas si ça marcherait mais au moins pour moi il y aurait une logique puisque this correspondrait au squelette et ainsi si on a un squelette qui a 75% de sa vie, on va obtenir le monstre test comme etant un squelette avec 75% de vie... Ou alors je n'y suis pas du tout?
Yozamu Voir le profil de Yozamu
Posté le 5 octobre 2013 à 15:04:39 Avertir un administrateur
Petite question, est-ce que la fonction cloneMonstre() s'utilise comme ceci:
Monstre squelette = new Monstre(parametres...);
// Modifications intermédiaires, modification de la vie du squelette, ...
Monstre test = squelette.cloneMonstre();
Je ne sais pas si ça marcherait mais au moins pour moi il y aurait une logique puisque this correspondrait au squelette et ainsi si on a un squelette qui a 75% de sa vie, on va obtenir le monstre test comme etant un squelette avec 75% de vie... Ou alors je n'y suis pas du tout?
Oui on l'utilise bien comme ça, le clone aura les mêmes attributs et les mêmes valeurs que l'instance original.
Ici, je ne vois pas à quoi correspond le this; pour moi, on dit "Voilà un nouveau Monstre, clone, qui est égal à CECI" et ceci pour moi représente... le vide! Vu qu'on a rien précisé avant
Dans ta phrase this ou "ceci" représente l'instance avec laquelle tu appelles la méthode. Tu as précisé tout à l'heure :
Monstre test = squelette.cloneMonstre();
Donc là c'est "squelette" qui appelle la méthode cloneMonstre(). Cette méthode contient :
Monstre clone = this;
Dans cette exemple this représente "squelette" c'est à dire l'instance de la classe Monstre qui a appellé cette méthode
D'accord j'ai compris!
Merci beaucoup pour l'aide apportée!
" D'accord pour le maxLife, mais imaginons qu'on remplace this.maxLife=maxLife par autre chose du style maxHP=maxLife, du coup maxHP représentera bien la vie maximale, et pour autant on aura pas mis le mot clé this, non? "
Exact, j'ai par exemple l'habitude d'appeler les paramètres p_maxLife par exemple pour pouvoir écrire
maxLife = p_maxLife;
mais certains préfèrent faire le contraire et écrire
this.maxLife = maxLife;
ou par question de clarté, on peut même préciser:
this.maxLife = p_maxLife;
Après c'est juste une question de clarté et comment tu préfères le préciser, mais le fait de rajouter "this." à chaque fois que tu réfères à un attribut peut t'aider à mieux comprendre le code.
Et comme j'ai dit, un exemple concret d'une situation où tu es obligé d'utiliser this serait si tu dois utiliser ton objet en argument d'une fonction.