Hola kikoGregoris, te respondo entre líneas (y mirá que no soy ningún experto)
On Mon, 7 Jul 2008 15:55:15 -0700 (PDT)
kikoGregoris <kikogregoris@...> wrote:
> También me pregunto porque se usa esto:
>
> Según el profe:
> Java, normalmente usa Dynamic Binding: la resolución de las invocaciones a
métodos, se resuelve en ejecución, basándose en el tipo del objeto receptor.
Java provee un mecanismo para determinar en ejecución el tipo del objeto
receptor e invocar al
> método apropiado.
>
> Si yo conozco su tipo, se que método se invoca en todo momento. NO ¿?. Será
por las interfaces ¿?
>
> Sobre interface, el profe las define así:
>
> -Una interface es un tipo de dato nuevo.
...
> -Entre las interfaces existe una jerarquía (independiente de la de las clases)
que permite herencia simple y múltiple. Cuando una interface deriva de otra,
incluye todas sus constantes y declaraciones de métodos.
>
> Aquí quiero hacer un alto, para preguntar algo que esta relacionado con la
herencia Multiple, Clases y Especies, que hablábamos en otro mail.
>
mmm... no. En mi opinión la herencia tiene que ver con comportamiento. Las
interfaces no son comportamiento. Una interfaz no añade nada nuevo al
comportamiento de una clase. Lo mejor es entender a las interfaces (a veces)
como "vistas" de una clase. La interfaz declara pero no define el comportamiento
(los métodos no tienen cuerpos). De todas formas concuerdo que puede ser
chocante para quienes tienen un paradigma de obejtos tan simple como los
smalltalkers. Sin embargo, resultaron ser super utiles en lenguajes orientados a
objetos de naturaleza estática o tipada como java.
> Ale decía en un histórico algo así:
>
> En resumen, colocar habilidades (caracteristicas sujetas a cambio)
> en la especiacion nos rigidiza el sistema y nos lleva a pensar
> a veces que necesitamos herencia multiple (que una especie
> hereda de dos especies).
> Fijate que la herencia por especie es herencia SIMPLE
> pues es resultado de la evolucion, no de mezclas
> de caracteristicas de individuos.
>
> No comprendo bien porque es herencia simple ¿??.
> Lo pregunto porque el profe usa el ejemplo de herencia múltiple como un buen
uso de las Interfaces.
mmm.. no estoy deacuerdo con tu profesor en java no es lo mismo heredar que
implementar; la herencia en java no es múltiple. pero bueno cada cual lo
entenderá a su modo... Para mi las interfaces van mas allá de los objetos o
tipos.... Por ejemplo la interfaz Control (play, stop, pause) puede ser
implementada por el panel de una lavarropa, de una licuadora por el control
remoto de una tv, por la interfaz gráfica de una applicación reproductor
multimedia o por el panel de un avión. No hay relación entre los objetos que
implementan la interfaz. La interfaz lo unico que dice es que a dichos objetos
les podremos enviar ciertos mensajes. define una semántica sobre un conjunto de
clases sin que estas tengan que estar relacionadas.
Una nota interesante sobre interfaces java. Yo actualmente estoy trabajando con
traductores java->javascript. javascript es un lenguage no tipado, con una
síntaxs parecida a la de java / C pero con una forma de trabajar mucho más
parecida a smalltalk en algunos aspectos. Estos traductores ignoran por completo
las interfaces cuando realizan la traducción. Es decir la interfaz no aporta
nada al funcionamiento del sistema... son solo un artilugio que facilita la
abstracción y la separación de responsabilidades a los humanos.
> En ST:
>
> >>recorrer: aCollection
>
> aCollection do:[:each | each imprimirCerificado].
>
> No les parece mucho mas simple y limpio que en JAVA ??.
>
jaja. Siguiendo con el tema de interfaces, una de los motivos de las interfaces
es poder trabajar con closures en java. Una closure es la declaración literal de
un bloque de código como el de tu ejemplo anterior ([:each | each
imprimirCerificado]). Ya se que este es un ejemplo medio bobo, pero está bueno
comparar las closures en lenguajes con y sin tipos y ver como se las arreglan
los lenguajes no tipados (el secreto está en las declaraciones de clase
anónimas). Tu código smalltalk desglosado sería:
|miClosure aCollection|
miClosure:=[:each | each imprimirCerificado].
aCollection do:miClosure.
En java sería algo como:
interface MiClosure<T> {
void run(T o);
}
MiClosure<Persona> miClosure = new MiClosure<Persona>() {
void run(Persona p) {
p.imprimirCertificado();
}
}
Iterator<Persona>i=aCollection.iterator();
while(i.hasNext()) {
miClosure.run(i.next());
}
igualito no? jajaja . Notar cómo debo declarar el tipo de la closure anteds de
instanciar el objeto que representa la closure. Notar como una closure en java
no es más que un objeto común y corriente cumpliendo con un trabajo un poco
extraño... para un objeto...
> Preguntas:
>
> Porque hay que usar iteredores ¿?.
> Cual es la limitación técnica, para no usarlos o para usarlos ¿?.
la idea de utilizar iteradores es poder acceder a una Collection (no importa
cual) de forma homogenea. Collection<T>, Iterator<T>, etc son interfaces
implementadas por las colecciones en si y sus propios iteradores. esto te
permite hacer i=col.iterator() no importando cuál sea la colección en si. Dado
que cualquier colección puede iterarse utilizando los mismos mensajes, en las
últimas versiones del lenguage optimizaron el compilador para que acepte
iteraciones de este tipo "for(Persona p : aCollection) {}"
> Porque las colecciones se implementan a nivel de inteface y no como una
jerarquía de clases comunes y corrientes como en ST ¿??.
No. Las colecciones de java se implementan en clases, igual que las de
smalltalk. La jerarquía de clases que implementan las colecciones en java es
bastante parecida a la de smalltalk. Sin embargo, la diferencia está en el uso
de interfaces para separar responsabilidades. Por ejemplo:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
quiere decir: Vector es una Abstractlist que acepta los mensajes
declarados en List, RandomAccess, Cloneable y Serializable
> Como solucionan el que la colección pueda alojar cualquier tipo/clase de
objeto ¿?.
>
igual que en smalltalk, almacenando Object s. Te obviás el casteo de tipo
utilizando genericos (Collection<Persona>).
>
>
> Saludos kiko
> PD: Mis preguntas no tienen carácter irónico o de mala leche, solo pregunto
intentando no ser uno mas de los tantos que hablan de todo sin saber nada.
>
>
>
________________________________________________________________________________\
____
> ¡Buscá desde tu celular!
>
> Yahoo! oneSEARCH ahora está en Claro
>
> http://ar.mobile.yahoo.com/onesearch
--
Sebastian Gurin <sgurin@...>