C’est quoi un Objet ?

Nos échanges internes, souvent passionnés (et parfois alcoolisés) du soir nous ramènent souvent à la question fondamentale « c’est quoi un objet (en informatique) ? »
et autres sous-question du genre « c’est quoi la différence entre le sous-typage et l’héritage ? » ou « c’est quoi un type ? »

Sur l’objet, un dessin vaut mieux qu’un grand discours …

La réponse un peu mieux expliquée …

Les vrais fondements

1/ l’encapsulation
Les données internes et privée de l’objet (à ne pas confondre avec l’agrégation ou la composition comme malheureusement je le vois avec horreur dans certaines réponses à nos tests d’évaluation)

2/ l’envoi de message
Les objets sont sollicités par envoi de message et ce sont eux qui déterminent le traitement à effectuer

Le reste n’est pas fondamental mais en découle plus ou moins :

3/ le polymorphisme
Un objet peut être remplacé par un autre qui sait répondre aux messages attendus
Conséquence du 2 (le même message peut être envoyé à des objets différents et c’est l’objet receveur qui détermine la méthode à exécuter)

4/ le mécanisme d’héritage
Consiste à éviter de recopier les mêmes méthodes dans des objets différents.
Les langages à base de classe (ndr: comme Java, smalltalk, php) proposent une relation d’héritage entre classes (les méthodes sont portées par les classes et les objets sont instances de ces classes)
Les langages à base de prototype (ndr: comme javascript) font porter les méthodes par les objets directement mais les objets font références à des prototypes (la recherche de méthodes est déléguée au prototype lorsque l’objet ne trouve pas la méthode correspondant au message reçu).

Qu’en est-il du typage ?
Le typage n’est pas une notion objet. C’est une notion de compilation.
Ce qu’on type, ce sont des variables, paramètres et retours de traitements (fonction, méthode, procédure)
Dans un système objet à base de classes, les classes servent généralement aussi de type.
Et la relation d’héritage correspond un peu à la notion de sous-type.

Par abus de langage, on parle parfois de typage dynamique dans les langages à objets non typés.
Java a formalisé le concept d’interface (qui correspond à la notion de type abstrait)
ce qui dissocie un peu plus encore le typage de l’héritage.

Article honteusement inspiré d’échanges sur la mailing liste interne et d’une réponse synthétique de Jean-François