POO : pourquoi des attributs non privés ?

Bonjour à tous

Je suis en train d’aborder l’approche objet et la programmation du même genre et une question me turlupine. L’encapsulation permet de protéger les attributs des objets à l’aide d’interfaces, pour peu que ces attributs soient privés. OK. Et si l’on souhaite faire un logiciel totalement orienté objet, il faut s’en tenir à cette règle, me semble-t-il.

Je me demande donc dans quels cas on pourrait être amené à utiliser des attributs semi-privés ou publics ? J’ai l’impression qu’on a laissé la possibilité aux développeurs d’utiliser des attributs pas forcément privés pour dire qu’ils ont la liberté de le faire mais que fondamentalement ça ne devrait jamais arriver. Est-ce que je comprends bien ?

Merci à vous

Souvent on utilise les attributs publiques pour des attributs statiques (surtout quand ils sont constants).

Mais sinon le seul cas où ça peut avoir une utilité c’est pour créer des classes à la volée. J’ai la flemme de te chercher un exemple mais ça existe pour de vrai.

Les protected aussi je ne trouve pas ça propre. Une classe dérivée ne devrait pas voir l’implémentation de sa mère, mais peut être qu’il existe des cas tordus que je ne connais pas où l’usage est bon. Je parle pour les attributs, pour les méthodes ça peut être très pratique et propre.

[quote]Mais sinon le seul cas où ça peut avoir une utilité c’est pour créer des classes à la volée.[/quote]Ca sert à quoi ?

Le premier exemple de class à la volé qui me vient à l’esprit serait pour les ORM type Hibernate.

Mais pour les attributs privés, l’utilisation typique est une classe de constantes.

Tu n’a probablement pas vu les functors et/ou le pattern stratégie c’est pour ça.

Dans un langage impératif comme le C, tu peut utiliser un pointeur de fonction pour qu’une fonction ai un comportement différent. Imaginons une méthode map :

La méthode map va appliquer la fonction ma_function à chaque élément de mon_tab.

Si tu veut écrire sa dans un langage objet, tu va écrire une classe Tableau qui aura une méthode map et qui prendra une fonction. Sauf que ça n’est pas possible (dans les concepts orientés objets, en C++ tu peut le faire). Car ça n’a pas de sens d’utiliser une méthode sans l’objet qui va avec.

La solution consiste à dire que ta méthode map prend en argument une interface. Cette interface t’assure que l’objet qui t’es donné possède une méthode bien déterminée et que tu va utiliser (tu peut regarder l’interface Runnable de Java : docs.oracle.com/javase/6/docs/ap … nable.html). L’utilisateur pour appliquer une méthode à tout les élément du tableau, devras créer une classe qui implémente cette interface et qui dans la méthode défini par cette interface fait l’action qu’il souhaite.

C’est chiant quand tu n’a pas grand chose à faire, donc tu peut faire ça :

mon_tab.map(new MyInterface() { public int ma_function(int t) { return t + 2; } }

C’est du Java.

Je ne suis pas sûr d’avoir était très clair pour quelqu’un qui n’est pas habitué à l’objet, mais n’hésite pas à me demander de préciser.

mhmm le sujet est complex, sa dépant de l’eritage, je te conseil un livre

pearson.fr/livre/?GCOI=27440100273300

petite critique:
les +
simple meme pour un gros débutant, complet. execice a la fin de chaque chapitre. personellment j’ai préferer lire le livre avant,
plus tard je ferai les execices. orienter objet. les question posée ici son dedant :slightly_smiling:

les moins
manque d’algo,peux de code vraiment utilisable,c’est donc vraiment destiner a apprendre , quelque par c’est pas si mal.
lourd 700 page env donc pour aller a la plage avec ben…

vala :slightly_smiling: