Leandro Martín Malsam wrote:
> Y pidiéndole un poco más de detalles, me contó que esta duda le
> surgió, además de lo que mencioné en el primer mail, revisando apuntes
> de C#, en donde un profe dijo que cada vez que instanciabas un objeto,
> se creaba una instancia de dicho objeto, y otra instancia por cada
> superclase.

te diría que el profesor ese lo dijo metaforicamente, digamos. No creo
que sea así, es bastante imposible que el código funcione
indistintamente si es así como decis. Y estoy hablando de Smalltalk,
C++, Java y C# (aunque los últimos 2 de oido).

Lo que si sucede es:

Object -> Transporte -> Auto

si Transporte tiene variables de instancia, y auto tiene más, entonces
Auto termina teniendo, implicitamente, las de Transporte y las de Auto.
Lo mismo pasa con los métodos. Ahora, hay un detalle importante, la
posición relativa de cada variable de instancia tiene que ser la misma
tanto en Transporte como en Auto (para las variables de instancia
compartidas). Así, si Transporte tiene una variable de instancia
'patente', y esta está en el offset 4 de la memoria asignada a los
Transporte, entonces, para los Auto tambien tiene que estar en el offset
4. Y esto es indispensable que sea así, porque los métodos de Transporte
tienen que funcionar tanto para los Transporte como para los Auto, y
tienen que funcionar indistintamente ("polimorficamente" si queres). La
unica alternativa a esto es que las variables de instancia, en vez de
accederse por offset se accedan SIEMPRE por nombre, y no conosco ningun
lenguaje que sea así (quizas ObjectiveC o self alguien sabe? no creo que
self por la performance)

Se entendió esto? erm.. ejemplo concreto, en Smalltak, pero podría ser
en cualquier otro lenguaje.

Transporte >> patente
    ^patente

eso se compila a Bytecode como, por ejemplo

Transporte >> patente
    LoadInstanceVariable 1
    return

que termina siendo acceder al offset 4 de la memoria asignada al objeto.

Ahora, si mandás

Auto new patente

eso tiene que funcionar, por lo tanto en auto tambien tiene que estar en
el offset 4, entonces tiene que ser la variable de isntancia 1: Es
decir, tienen que tener la misma estructura para las variables de
instancia comunes.

Habiendo entendido esto, podemos decir que en los lenguajes donde "no
hay method lookup", y las llamadas a metodos son simplemente
indirecciones a partir de una tabla de punteros a funciones (vTable,
hablamos de C++ por ejemplo), pasa lo mismo para las funciones
"virtuales" que son heredadas por las subclases. Porque también tiene
que funcionar el polimorfismo.

Es verdad que en C++ como todo se resuelve en el momento de compilación
esto se podriamos pensar que hay alguna otra forma de resolverlo. Pero
la verdad es que no hay otra forma, porque por ejemplo, en Windows,
podes tener subclases implementadas en una DLL que se linkea en tiempo
de ejecucion, y entonces eso es algo que no se sabe en tiempo de
compilacion, es decir: hay que resolverlo por offsets fijos (o method
lookups a partir de nombres)

    es decir: el profesor ese estaba hablando metafóricamente, y se
puede entender así:

Cuando instancias algo de una subclase, la nueva instancia tiene adentro
(embebida, inlineada, incrustada) una instancia de la superclase

    richie

pd: suerte que estoy de vacaciones :)

--~--~---------~--~----~------------~-------~--~----~

To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]

http://www.clubSmalltalk.org
-~----------~----~----~----~------~----~------~--~---

Responder a