Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et méthodes
de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
*Remarque* :
J'utilise /r1/ et non /o1/ pour bien souligner que ce n'est pas un objet
mais une référence. Attention, dans la pratique, nous avons tendance à
interchanger ces termes. En java, il y a des identifiants pour les
référence (/r1/), les méthodes (/uneMethode/), les classes (/B/), les
types primitifs, etc., mais il n'y en a pas pour les objets !
Valdo.
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et méthodes
de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
*Remarque* :
J'utilise /r1/ et non /o1/ pour bien souligner que ce n'est pas un objet
mais une référence. Attention, dans la pratique, nous avons tendance à
interchanger ces termes. En java, il y a des identifiants pour les
référence (/r1/), les méthodes (/uneMethode/), les classes (/B/), les
types primitifs, etc., mais il n'y en a pas pour les objets !
Valdo.
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et méthodes
de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
*Remarque* :
J'utilise /r1/ et non /o1/ pour bien souligner que ce n'est pas un objet
mais une référence. Attention, dans la pratique, nous avons tendance à
interchanger ces termes. En java, il y a des identifiants pour les
référence (/r1/), les méthodes (/uneMethode/), les classes (/B/), les
types primitifs, etc., mais il n'y en a pas pour les objets !
Valdo.
Le fait que la classe concrète de la partie droite soit équivalente au
type de la partie gauche n'implique rien de particulier pour la suite.
Mais alors pourquoi se donner la peine de l'écrire sous la forme A
o2=new B();
Le fait que la classe concrète de la partie droite soit équivalente au
type de la partie gauche n'implique rien de particulier pour la suite.
Mais alors pourquoi se donner la peine de l'écrire sous la forme A
o2=new B();
Le fait que la classe concrète de la partie droite soit équivalente au
type de la partie gauche n'implique rien de particulier pour la suite.
Mais alors pourquoi se donner la peine de l'écrire sous la forme A
o2=new B();
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Ton approche de l'objet (en dehors de Java proprement dit) m'interresse.
As tu un livre en francais à me conseiller sur le sujet ?
Ton approche de l'objet (en dehors de Java proprement dit) m'interresse.
As tu un livre en francais à me conseiller sur le sujet ?
Ton approche de l'objet (en dehors de Java proprement dit) m'interresse.
As tu un livre en francais à me conseiller sur le sujet ?
*Un Messie : /Grady Booch/*
*Une bible : /Design Patterns/*
*Un Messie : /Grady Booch/*
*Une bible : /Design Patterns/*
*Un Messie : /Grady Booch/*
*Une bible : /Design Patterns/*
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Il est possible que je sois complétement à côté de la plaque mais c'est
vraiment pas évident à comprendre ...
allez oups je vais tenter l'aventure et je vais m'appuyer sur un exemple...
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Il est possible que je sois complétement à côté de la plaque mais c'est
vraiment pas évident à comprendre ...
allez oups je vais tenter l'aventure et je vais m'appuyer sur un exemple...
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe, erreur?
Il est possible que je sois complétement à côté de la plaque mais c'est
vraiment pas évident à comprendre ...
allez oups je vais tenter l'aventure et je vais m'appuyer sur un exemple...
Pourquoi o2 ne peut accéder à la couleur?
Parce que o2 "croit" qu'il référence une instance de A et non de B. Or A
n'a pas de couleur.
Si tu complètes par o3 = o2; tu peux alors accéder à la couleur de o2
via la référence o3.
Si tu fais o2 = o3, le compilateur te jette car o2 n'a pas la capacité
de représenter une référence sur B ;
Maintenant dans la pratique, c'est util pour simplifier l'usage de ton code.
Tu crées la classe GestionRessourcesHumaines :) et tu donnes une
interface (vue limitée) IComptable au comptable, IProjet au chef de
projet et IEmbauche au recruteur...
Chacun ne voit que la partie qui le concerne :
plus simple à produire -tu peux morcellé ton dev
plus simple à utiliser - l'interface est ton "seul engagement" vis à vis
des utilisateurs de ta classe.
et moins d'effet de bord dans la vie du produit par rapport à une
application mainframe par exemple :)
Pourquoi o2 ne peut accéder à la couleur?
Parce que o2 "croit" qu'il référence une instance de A et non de B. Or A
n'a pas de couleur.
Si tu complètes par o3 = o2; tu peux alors accéder à la couleur de o2
via la référence o3.
Si tu fais o2 = o3, le compilateur te jette car o2 n'a pas la capacité
de représenter une référence sur B ;
Maintenant dans la pratique, c'est util pour simplifier l'usage de ton code.
Tu crées la classe GestionRessourcesHumaines :) et tu donnes une
interface (vue limitée) IComptable au comptable, IProjet au chef de
projet et IEmbauche au recruteur...
Chacun ne voit que la partie qui le concerne :
plus simple à produire -tu peux morcellé ton dev
plus simple à utiliser - l'interface est ton "seul engagement" vis à vis
des utilisateurs de ta classe.
et moins d'effet de bord dans la vie du produit par rapport à une
application mainframe par exemple :)
Pourquoi o2 ne peut accéder à la couleur?
Parce que o2 "croit" qu'il référence une instance de A et non de B. Or A
n'a pas de couleur.
Si tu complètes par o3 = o2; tu peux alors accéder à la couleur de o2
via la référence o3.
Si tu fais o2 = o3, le compilateur te jette car o2 n'a pas la capacité
de représenter une référence sur B ;
Maintenant dans la pratique, c'est util pour simplifier l'usage de ton code.
Tu crées la classe GestionRessourcesHumaines :) et tu donnes une
interface (vue limitée) IComptable au comptable, IProjet au chef de
projet et IEmbauche au recruteur...
Chacun ne voit que la partie qui le concerne :
plus simple à produire -tu peux morcellé ton dev
plus simple à utiliser - l'interface est ton "seul engagement" vis à vis
des utilisateurs de ta classe.
et moins d'effet de bord dans la vie du produit par rapport à une
application mainframe par exemple :)
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de A")
ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt possible
et qui n'est pas forcément évident. L'édition de lien est statique. Ca
signifie que le choix de la signature de la méthode à appeler est
déterminé à la compilation.
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de type
A (soit ri). Le compilo va chercher si la classe A possède une signature
de méthode correspondante
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien sur
une instance de B, qui possède cette signature de méthode.
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de
A") ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt
possible et qui n'est pas forcément évident. L'édition de lien est
statique. Ca signifie que le choix de la signature de la méthode à
appeler est déterminé à la compilation.
Que veut dire "signature" ?
Par contre, le choix de l'implémentation de la méthode est dynamique,
c'est à dire déterminé à l'exécution (ce quipermet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de
type A (soit ri). Le compilo va chercher si la classe A possède une
signature de méthode correspondante
quelle est-elle dans cet exemple?
(ce qui n'est pas le cas -> erreur de compile)et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien
sur une instance de B, qui possède cette signature de méthode.
Dans cet exemple qu'est ce qui permet de dire que l'implémentation de la
méthode est dynamique?
Lea ecrivit le 25/02/2005 14:25 :
Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)
la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de
A") ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).
-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK
-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt
possible et qui n'est pas forcément évident. L'édition de lien est
statique. Ca signifie que le choix de la signature de la méthode à
appeler est déterminé à la compilation.
Que veut dire "signature" ?
Par contre, le choix de l'implémentation de la méthode est dynamique,
c'est à dire déterminé à l'exécution (ce qui
permet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de
type A (soit ri). Le compilo va chercher si la classe A possède une
signature de méthode correspondante
quelle est-elle dans cet exemple?
(ce qui n'est pas le cas -> erreur de compile)
et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien
sur une instance de B, qui possède cette signature de méthode.
Dans cet exemple qu'est ce qui permet de dire que l'implémentation de la
méthode est dynamique?
Lea ecrivit le 25/02/2005 14:25 :Lea wrote:
Je suis pas sûre de tout avoir compris :
Je ne suis pas connu pour ma grande pédagogie... ;)la référence o1 construite avec les données, constructeurs et
méthodes de la classe B "se situe" dans la classe A ou B?
*Exemple* :
<code>
public interface A {
public void uneMethode();
}
public class B implements A {
public B() {
//...
}
public void uneMethode() {
//...
}
public void uneAutreMethode() {
//...
}
}
public class Main {
public static void main(String[] args) {
A r1 = new B();
r1.uneMethode(); // OK.
r1.uneAutreMethode(); // ERREUR!
}
}
</code>
A r1 = new B();
-->on crée une référence r1 de type A (donc "pilotable à partir de
A") ayant les méthodes de B?
r1.uneMethode();
Pas exactement, tu crées une référence sur un type A, mais tu lui
affectes une instance de type B, ce qui est possible car B hérite de A
(B est aussi A).-->renvoie à la méthode de la classe A, non?
-->puisque pilotable à partir de A et méthode de la même classe, pas
d'erreur?
r1.uneAutreMethode();
OK-->renvoie à la méthode de la classe B, non?
-->puisque pilotable à partir de A et méthode d'une autre classe,
erreur?
Erreur de compilation car le type A n'a pas cette méthode.
Il y a un concept fondamentale en java à comprendre le plus tôt
possible et qui n'est pas forcément évident. L'édition de lien est
statique. Ca signifie que le choix de la signature de la méthode à
appeler est déterminé à la compilation.
Que veut dire "signature" ?
Par contre, le choix de l'implémentation de la méthode est dynamique,
c'est à dire déterminé à l'exécution (ce quipermet de le polymorphisme).
Dans l'exemple, tu appelles uneAutreMethode(), sur une référence de
type A (soit ri). Le compilo va chercher si la classe A possède une
signature de méthode correspondante
quelle est-elle dans cet exemple?
(ce qui n'est pas le cas -> erreur de compile)et ce alors même que tu sais, toi, qu'à l'exécution ri pointera bien
sur une instance de B, qui possède cette signature de méthode.
Dans cet exemple qu'est ce qui permet de dire que l'implémentation de la
méthode est dynamique?