OVH Cloud OVH Cloud

[Débutante] Construction d'un objet

30 réponses
Avatar
Lea
Bonjour,

Que fait-on avec l'instruction suivante :
A o1=new B();

Merci.

Léa

10 réponses

1 2 3
Avatar
Valdo Tschantre
Lea wrote:


Lea wrote:

Que fait-on avec l'instruction suivante :
A o1=new B();


[...]



[...]



En fait c'est pas ça que j'aurais dû demander depuis le début mais
plutôt quelle est la différence entre les deux instructions suivantes et
quelles sont les conséquences pour la deuxième instruction au niveau de
l'accès des données de la classe A puis de la classe B :

A o1=new A();
A o2=new B();


Je te disais dans mon précédant post, que la classe /B/ devait être une
classe concrète dérivée du type /A/. J'aurrais dû dir que la classe /B/
devait être soit une classe concrète dérivée du type /A/ soit la classe
/A/ elle-même.

Ce faisant, la ligne de code /A o1 = new A()/ n'est qu'un cas remarcable
de la forme /A o2 = new B()/, où /B/ est /A/. 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.


*Pour aller plus loint* :

Pour le modele objet, Grady Boosh définit un objet comme suit :

objet = identité + interface + comportement

Rapporté au langage Java on pourrait dire :
- que le constructeur /B()/ (ou /A()/) spécifie le _comportement_ possible,
- que l'instruction /new/ assure l'_identité_
- et que la partie gauche définit l'_interface_ à travers là quel on
"pilotera" l'objet.

En Java, le fait que le type /A/ ait un rapport hiérarchique avec la
classe /B/ (ou /A/) tient au seulement fait que ce langage est typé.


*Conseille de programmation* :

Autant ce fair ce peut, pour découpler l'impléméntation de
l'utilisation, fais en sorte que la partie gauche (le type /A/) soit une
interface au sens Java et non une classe.


Valdo.




Avatar
Valdo Tschantre
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.

Avatar
ZebX

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 !


Ton approche de l'objet (en dehors de Java proprement dit) m'interresse.
As tu un livre en francais à me conseiller sur le sujet ?

Avatar
Wismerhill
ZebX ecrivit le 25/02/2005 13:01 :


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 !



Ton approche de l'objet (en dehors de Java proprement dit) m'interresse.
As tu un livre en francais à me conseiller sur le sujet ?


Bin heu, n'importe quel bouquin sur la programmation objet vu que ce
sont les principes de base.


Avatar
ZebX

Bin heu, n'importe quel bouquin sur la programmation objet vu que ce
sont les principes de base.


Ce qui est écrit oui, mais je ne pense pas que la culture de Valdo
s'arrete là...

Les bouquins sur l'objet que je connais sont soient opérationnels,
soient très évasifs.

Avatar
Wismerhill
ZebX ecrivit le 25/02/2005 13:15 :


Bin heu, n'importe quel bouquin sur la programmation objet vu que ce
sont les principes de base.



Ce qui est écrit oui, mais je ne pense pas que la culture de Valdo
s'arrete là...

Les bouquins sur l'objet que je connais sont soient opérationnels,
soient très évasifs.


Ah bon ? Bin, je te conseile Code Complete alors.


Avatar
ZebX

Ah bon ? Bin, je te conseile Code Complete alors.


En parcourant les titres, ca semble correspondre pile poil à ce que je
recherche.

Merci.

Avatar
Lea

Ca se résume à un problème de portée.


A o1=new A();
A o2=new B();


B o3=new B();

Si A est un Object et B hérite de A et possède l'attribut couleur.

o1 n'a pas d'attribut couleur.
o2 possède mais ne peut pas accéder à l'attribut couleur.


Pourquoi o2 ne peut accéder à la couleur?

o3 possède et accède à l'attribut couleur.




Avatar
Lea
Lea wrote:



Lea wrote:

Que fait-on avec l'instruction suivante :
A o1=new B();



[...]



[...]



En fait c'est pas ça que j'aurais dû demander depuis le début mais
plutôt quelle est la différence entre les deux instructions suivantes
et quelles sont les conséquences pour la deuxième instruction au
niveau de l'accès des données de la classe A puis de la classe B :

A o1=new A();
A o2=new B();



Je te disais dans mon précédant post, que la classe /B/ devait être une
classe concrète dérivée du type /A/. J'aurrais dû dir que la classe /B/
devait être soit une classe concrète dérivée du type /A/ soit la classe
/A/ elle-même.

Ce faisant, la ligne de code /A o1 = new A()/ n'est qu'un cas remarcable
de la forme /A o2 = new B()/, où /B/ est /A/.
Que faut-il comprendre par "cas remarquable"?


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();


*Pour aller plus loint* :

Pour le modele objet, Grady Boosh définit un objet comme suit :

objet = identité + interface + comportement

Rapporté au langage Java on pourrait dire :
- que le constructeur /B()/ (ou /A()/) spécifie le _comportement_ possible,
- que l'instruction /new/ assure l'_identité_
- et que la partie gauche définit l'_interface_ à travers là quel on
"pilotera" l'objet.


J'ai pas vu la notion d'interface encore mais je pense que l'on peut
dire aussi que la partie gauche définit l'_interface_ ou la classe à
travers laquelle on "pilotera" l'objet, non?

Quelles seront les conséquences concernant l'accès des données et
méthodes de la classe B si l'on pilote à partir de la classe A et non
pas de la classe B?


En Java, le fait que le type /A/ ait un rapport hiérarchique avec la
classe /B/ (ou /A/) tient au seulement fait que ce langage est typé.


*Conseille de programmation* :

Autant ce fair ce peut, pour découpler l'impléméntation de
l'utilisation, fais en sorte que la partie gauche (le type /A/) soit une
interface au sens Java et non une classe.


Pourquoi?


Valdo.






Avatar
ZebX

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 :)

1 2 3