Hola Bruno,
Cada vez que alguno sugiere la necesidad de la herencia
múltiple en el paradigma de Objetos, los que consideramos que es
innecesaria (y perjudicial) mostramos que esas supuestas necesidades
pueden satisfacerse con delegaciones. Esto es exactamente lo que Vos
estás haciendo en tu solución. Tu Dragón recibe un mensaje que no
tiene implementado entonces lo delega en sus colaboradores, una
INSTANCIA de Lagarto y una INSTANCIA de Pájaro. Extrañamente se lo
enviás a ambos en lugar de "elegir" de algún modo quién lo responderá.
Ahora supongamos que tu mecanismo de selección (on: Error, result
notNil:...) funcionara... entrás en el famoso "Problema de self" que
podríamos resumirlo en lo siguiente:
Supongamos que La Clase Pájaro implementa #message1 y #message2 y la
clase Dragón implementa el mensaje #message2.
Supongamos que tu Dragón recibe un mensaje #message1 que no
implementa, y entonces lo delega y lo resuelve el Pájaro.
Supongamos ahora también que dentro del código del método
correspondiente a #message1 en la clase Pájaro , hay una línea que
dice:
self message2.
....
Si estuviésemos hablando de Herencia, es decir, si Dragón heredara de
Pájaro, el objeto que está ejecutando #message1 es UN DRAGÓN, aunque
use la implementación de la clase Pájaro, pero es un dragón, por lo
cual, en la línea "self message2" self es el dragón y el message2 que
se ejecuta es el de dragón.... en cambio en tu ejemplo, el objeto que
está ejecutando #message1 es un pájaro, entonces cuando la línea "self
message2" ejecuta el método "incorrecto".... y ni hablar de lo que
pasaría si el pájaro does not understand #message2 ...
Me quedan muchas más preguntas, como por ejemplo que pasa con
super.... pero no lo quiero hacer muy largo!!!
Abrazo,
Claudio
On 19 abr, 16:59, "Bruno Buzzi Brassesco" <[EMAIL PROTECTED]>
wrote:
> Discutiendo con un amigo que decía que Smalltalk no tenia herencia múltiple.
>
> Aunque sea discutible la necesidad de herencia múltiple, me pregunte cuan
> rápido se podrá implementar herencia múltiple en Smalltalk y poner a prueba
> su flexibilidad.
>
> En "7 líneas de código" o 5 minutos ... hice esto:
>
> Se puede discutir sobre la validez de la implementación (la variable #
> superinstances y sus implicaciones) pero NO es el punto central.
>
> Lo central es que si en 5 minutos se puede hacer esto, que será después de
> estar un año trabajando sobre un tema…
>
> Implementa algo así en C# (u otro) valor!!!
>
> Object subclass: #HerenciaMultiple
>
> instanceVariableNames: 'superinstances'
>
> classVariableNames: ''
>
> poolDictionaries: ''
>
> classInstanceVariableNames: ''
>
> initialize
>
> super initialize.
>
> superinstances := OrderedCollection new.
>
> superinstances addAll: (self superclasses collect: [:each | each
> new initialize])
>
> doesNotUnderstand: failedMessage
>
> superinstances do: [:each | | result |
>
> [result := each perform: failedMessage selector
> withArguments: failedMessage arguments] on: Error do: [:ex | ].
>
> result ifNotNil: [:value | ^value]].
>
> ^super doesNotUnderstand: failedMessage
>
> Object
>
> Lagarto
>
> Pajaro
>
> HerenciaMultiple
>
> Dragon
>
> Dragon class
>
> superclasses
>
> ^OrderedCollection with: Lagarto with: Pajaro
>
> Saludos,
>
> bruno
>
> No virus found in this outgoing message.
> Checked by AVG.
> Version: 7.5.524 / Virus Database: 269.23.2/1387 - Release Date: 4/19/2008
> 11:31 AM
--~--~---------~--~----~------------~-------~--~----~
Has recibido este mensaje porque estás suscrito a Grupo "ClubSmalltalk" de
Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a [email protected]
Para anular la suscripción a este grupo, envía un mensaje a [EMAIL PROTECTED]
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/clubSmalltalk?hl=es.
-~----------~----~----~----~------~----~------~--~---