Citation:
Envoyé par
bretus
1 : Ca ne permet pas d'avoir un type unique à mettre dans un tableau par exemple.
Normalement, tu ne devrais jamais commencer à mettre tout et n'importe quoi dans un tableau unique.
Tu peux, bien sur, vouloir faire cohabiter certains types dans des collections, mais le nombre de type différents que tu va faire cohabiter est classiquement assez restreint:
Tu peux envisager de faire cohabiter des avions, des motos et des camions si tu considère que ce sont des véhicules tout comme tu peux faire cohabiter des chats, des serpents et des éléphants si tu considère que ce sont des animaux.
Mais il n'y a aucun sens à vouloir faire cohabiter des véhicules avec des animaux. Or, c'est, justement, ce que permet l'existence d'un super objet.
Il est évident qu'il faut avoir recours aux hiérarchies de classes, c'est l'un des fondements même de l'Orienté Objet.
Tout comme il est évident que, dés que l'on parle de hiérarchies de classes, cela implique qu'il y aura, pour chaque hiérarchie, un objet de base.
Par contre, cela ne veut pas forcément dire que toutes les hiérarchies envisageables devront être... reliée entre elles par un super objet.
Citation:
2 : A bas niveau, je veux bien; A haut niveau, ça revient à faire de l'héritage sans le documenter.
Absolument pas...
L'avantage, justement, des template, c'est qu'un Type<Truc> est tout à fait indépendant d'un Type<Machin>, même si, effectivement, ils partagent la même interface.
En simplifiant on pourrait dire que l'on pousse la réflexion sur le comportement des objets bien plus loin que ce que l'on fait généralement en OO.
Citation:
Dans tous les cas, ça impose les mêmes contraintes sur la classe dérivée, sauf que l'on perd beaucoup d'information que l'on trouve par exemple dans des classes composées de méthodes virtuelles pure.
Cela impose certaines contraintes, en effet, mais cela apporte également une grande souplesse, et, justement, cela évite d'avoir des hiérarchies de classes plus imposantes que les pyramides d'Egypte
Ce qu'il faut comprendre, c'est que tout n'est pas forcément adapté à tout.
Dans certains cas, l'héritage public "classique" d'un objet ne présentant que des fonctions virtuelles pures sera la moins mauvaise solution, dans d'autres, une approche basée sur la généricité et ses techniques particulières (CRTP, type erasure, traits et politiques en tête) s'avérera bien plus avantageuse.
Le tout sera toujours d'évaluer correctement les avantages et les inconvénients de chaque technique ;)
Citation:
C'est un exemple de mauvaise utilisation de la généricité et à la rigueur d'absence de contrôle sur les types génériques. C'est le modèle métier maison qui ne fait pas les vérifications nécessaires.
Pas besoin de SuperObjet pour créer ce genre de problèmes. Il suffit d'un mauvais modèle.
C'est surement un problème de conception, mais il sera bien plus facile d'y arriver si un super objet entre dans la danse que si les hiérarchies sont clairement distinctes.
Citation:
L'héritage est adapté aux comportements identiques point barre.
Non, il est adapté quand tu peux décemment estimer qu'il y a une relation EST-UN entre deux objets selon la granularité que tu envisages...
Citation:
En C++, on hérite d'une table de méthode virtuelles en natif après tout.
Non, justement...
A la différence de Java, il n'y a une table de méthodes virtuelles que (et uniquement) s'il existe une fonction virtuelle dans la classe.
Or, si tu pars, à la base, sur l'idée d'un super objet dont héritent (de manière directe ou indirecte) toutes tes classes, tu force à l'existence de cette table virtuelle quasi à tous les coups (car il y a de fortes chances qu'un certain nombre de fonctions de ce super objet soient virtuelles)
Citation:
Il faut bien avoir à l'esprit ce qui fait que l'on préfère la composition à l'héritage, pour ne pas appliquer mécaniquement ce principe.
Non...
Quand on préfère la composition à l'héritage, c'est parce que l'on a compris que l'héritage est la relation la plus forte qui puisse exister entre deux objets, et que la composition est une relation bien plus souple.
C'est pour cette raison que l'on conseille généralement de préférer la composition à l'héritage à moins que l'on ait de bonnes raison de recourir à ce dernier ;)
Citation:
Quand le SuperObjet rend les choses plus modulable et plus interchangeable; il peut apporter plus d'avantage que d'inconvénients.
Le fait est que, s'il rend (parfois à tord) les choses plus interchangeables, il ne rend pas forcément (je dirais même "bien au contraire") les choses plus modulables.
Et dans biens des cas, cet aspect "d'interchangeabilité" excessive devient rapidement un source de problèmes sans noms.
Citation:
Le fait est que le modèle Objet de C++ est restreint en natif au strict nécessaire.
C'est un fait... largement compensé par l'existance d'autres paradigmes fournis par le langage.
Citation:
Dès lors que l'on veut l'utiliser en plus haut niveau, que l'on veut faire communiquer ces objets, on est tenté d'étendre le modèle objet natif de C++.
Souvent à tord, car il est malgré tout rare que n'importe quel objet puisse envoyer n'importe quel message à n'importe quel autre objet.
Le plus souvent, un objet donné ne pourra envoyer qu'un certain type de message à une certain nombre d'objet et ne pourra (dans l'autre sens) recevoir qu'un certain type de message d'un ensemble d'objets clairement défini.