Luego de esto vienen algunas vueltas de tuerca: * El "error" que se tira cuando un lookup no encuentra un mensaje en realidad es un reemplazo de ese message send por un send de doesNotUnderstand:. Usualmente, las VMs revientan (o dejan de funcionar) si un lookup no encuentra doesNotUnderstand:. Luego, todas las subclases de nil (como Object) deben implementar doesNotUnderstand:.
* Como la responsabilidad de las clases es crear objetos y especificar la conducta de sus instancias, entonces en general es incorrecto implementar singletons del lado de la clase... ademas, eso siempre trae dolores de cabeza a la larga. * En Smalltalk todo es un objeto, luego las clases tambien son objetos y entonces todo lo que Andres dijo para "el lado de la instancia" vale para "el lado de la clase". Las clases de las clases son metaclases. Pero claro, al ser estas objetos tambien, tienen que ser de alguna clase: la *clase* Metaclass. Por supuesto, como es un objeto, esta clase tambien es una instancia de alguien... la *metaclase* Metaclass (que usualmente en Smalltalk se escribe Metaclass class). Lo lindo es que la clase de la metaclase Metaclass es la clase Metaclass, con lo que la recursion infinita se resuelve con un lazo. * Dado lo de arriba, es redundante implementar los siguientes mensajes: Object>>blah "Para que las clases tambien entiendan #blah" ^self class blah Object class>>blah "Para que las clases tambien entiendan #blah" ^self doSomething Andres (el otro). 2009/9/8 andres <[email protected]>: > > Leandro, > creo que estaría bueno desambiguar ciertos conceptos > antes de meterse en como se implementa la herencia. A mi personalmente > me pasó de "aprender" objetos leyendo libros de delphi y la verdad que > tenía una ensalada que ni te cuento. Llegue a hacer cosas como > > obj : MiClase; > ... > obj:=obj new; > > je, lo interesante no solo es que compilaba, sino que hasta andaba! (al > menos en los delphis 1, 2 y 3 si mal no recuerdo). Luego aparecen > errores esporádicos imposibles de debuggear :P. Pero bueno, dejando de > lado lo anecdótico: > > - En los lenguajes OO basados en clases (Java, St) todos los objetos son > instancia de una clase y la forma de crear un objeto (de "traerlo a la > vida") es pidiéndole a la clase que lo haga (y generalmente esto se hace > con el mensaje #new o similar). Ejemplo: > juan:=Persona new. > > - Cuando mandás un mensaje a un objeto lo que hace la máquina virtual es > buscar en la clase de ese objeto una implementación (método) que machee > con el mensaje. Por ejemplo si hacés: > > juan nombre > > lo que va a pasar es que la VM busca la clase del objeto "juan" (que es > Persona) y le pide que le de el método asociado al mensaje #nombre. Si > la clase lo tiene se lo da a la VM para que lo ejecute en el contexto > del receptor (en este caso "juan"). Si no lo tiene aparece un error. O > sea que una clase tiene, en principio, dos roles: > 1. Crear sus instancias. > 2. Funcionar como repositorio de comportamiento común a todas sus > instancias. > > - Entre clases (ojo, no entre objetos) se pueden establecer relaciones > de herencia. Cuando una clase A hereda de otra B se dice que B es > subclase de A (y A es la superclase de B). Al heredar B de A se dice que > se hereda todo el comportamiento y acá es donde entraría tu pregunta > (creo), que es ¿cómo se implementa dicha herencia? El mecanismo se > conoce como method lookup (y si la memoria no me falla el gran Hernán > Wilkinson tiene una tesis de grado muy buena relacionada con esto[*]) y > es mas o menos así: > > instanciaDeB:=B new. > instanciaDeB hola. > > al mandar el mensaje #hola a "instanciaDeB" se hace lo mismo que te > comenté anteriormente: la VM busca la clase y le pide el método que > implementa #hola. Si lo encuentra se evalúa en el contexto de > "instanciaDeB". Ahora bien, si no lo encuentra en realidad no tira un > error tan rápido, sino que sale a buscar en la superclase de B (o sea, > A) a ver si en esa clase no está el bendito método. Si lo encuentra pasa > lo mismo que antes (lo evalúa en el contexto de "instanciaDeB") y sino > sigue buscando. Hasta donde? En el caso de Smalltalk la búsqueda se hace > hasta Object (que vendría a ser algo así como la superclase de todas las > clases) y si no lo encuentra recién ahí se tira el error. > > No se si esto responde tu pregunta. Por el tema de los bytecodes y de > convertir dos objetos en uno la verdad que no se a que apunta tu amigo. > De última si hasta acá venimos bien podemos ver un poco sobre la > generación de bytecodes (o sino parafrasea la pregunta y tratamos de > encontrarle la vuelta :)) > > [*] Che Hernán, está colgada en la web tu tesis? > > Saludos, > Andrés > > > Leandro Martín Malsam escribió: >> por ahí el subject suena a novato, pero ahora entenderán. >> participando en un foro de mi facultad, encontré el siguiente "dilema" >> posteado por un usuario: >> >> *Habiendo ido el sabado a la tarde a la PyCon, escuche al tipejo de Google >> quejarse de el excesivo envio de mensajes entre objetos. >> Recien estuve chusmeando un poco, y me entero de que casi todos los >> lenguajes OO, cuando creas un objeto A que hereda de B, la maquina virtual >> crea un objeto A, un objeto B, y los relaciona. >> ¿Porque? >> ¿No es mas comodo y eficiente, crear un objeto A con las caracteristicas de >> B? >> osea, que en el codigo fuente, A herede de B, pero cuando todo se convierta >> a bytecode, estos "dos objetos" se conviertan en uno solo... >> Probablemente no me se explicar la idea... pero bue, ustedes entenderan :P.* >> >> >> se entendió? creo que la pregunta de mi compañero es clara. y bueno, como yo >> soy medio novato en estas cosas, no tuve mejor idea que trasladarles la >> inquietud a los eruditos de la materia, de quienes siempre se aprende algo. >> >> así que si se copan y nos iluminan un poco, les agradecemos. >> >> salu2 >> >> lea >> >> > >> > > > > --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] http://www.clubSmalltalk.org -~----------~----~----~----~------~----~------~--~---
