Les objets ont une valeur implicite: leur identité (peut être testée en appliquant ==
). Lorsque vous les enveloppez, vous cachez effectivement cette identité (pire, vous exposez également une identité potentiellement trompeuse, l'identité de l'encapsuleur lui-même). Donc, une approche évidente est de compenser cela en exposant l'identité de l'objet par une autre voie - explicitement. Par exemple. vous pouvez introduire une méthode Object getIdentity()
, qui renvoie un objet représentant réellement l'identité voulue, et permettant d'y appliquer ==
. L'inconvénient majeur est que vous autorisez toujours ==
sur le décorateur lui-même, par exemple. un danger:
- est assez naturel pour être dupé en elle (
identity == decorator
au lieu de identity == decorator.getIdentity()
)
- ne fait silencieusement la mauvaise chose (à comparer avec une exception d'exécution - bon débogage chance que)
le problème serait inexistant si, par exemple, les objets ont une méthode comme:
protected Object getIdentity() {
return this;
}
Sur quel opérateur ==
wo uld être défini, de sorte qu'un wrapper pourrait également envelopper l'identité de l'objet enveloppé, au lieu de le remplacer par le sien.
Il existe plusieurs façons d'interpréter ce que vous avez décrit dans une hiérarchie de classes. _djechelon_ a fourni une réponse donnée à une interprétation de votre question ... J'ai une autre interprétation à l'esprit donc vous voudrez peut-être nous fournir quelques extraits de code. – Isaac