Buenas gente,el tema es el siguiente.Estoy usando smalltalk en el Object browser que provee la catedra de paradigmas.
Tengo el set Soldados y el objeto ReyArturo.
Al set soldados le tengo que pasar soldados (de eso y de crearlos se encarga arturo).
Mi primera aproximacion fue crear un objeto (humanos) con las variables hp,poder y nombre.
La idea era setear el objeto,agregarlo a la coleccion y luego setearlo de vuelta y volverlo a agregar.
Demas esta decir que la segunda vez no lo tomo.Y cuando intente hacerle un select por el que tenia un hp determinado me tiro el primero,que era el unico que tenia en la coleccion y lo hizo como si le hubiera pasado solo el string con el nombre.
En fin,estoy medio al horno,lo se.Se acepta cualquier tipo de sugerencias.
Saludos.
no entendí mucho, hiciste todo un quilombo de cosas en tu explicación. si querés poné un screenshot o el modelo de objetos que tenés.
ojo con las palabras que usás, porque cuando decís "objeto" no sé si te referís a una clase o a una instancia. en smalltalk todo es un objeto.
ejemplos:
Set es una clase
Soldados es una variable, que tiene adentro un set (una instancia de la clase Set).
ReyArturo debería ser una instancia, de alguna clase Humano.
Otra cosa que tenés que tener en cuenta, es que un Set no guarda instancias duplicadas, por eso si vos tenés un único Soldado (Humano) y le vas cambiando las variables, no te sirve de nada, porque al meterlo al set va a ser el mismo (sólo que le cambiaste el nombre), así que no lo mete.
Espero poder orientarte un poco con ésto, pero no veo claro tu planteo. Tirame más data y lo vemos.
SI la verdad que es alto bardo asi que voy a tratar de explicarme algo mas.
Tengo tres objetos (lo que se entiende por objetos en el object browser que es lo que se usa las primeras clases)
-ReyArturo
-Soldados (aSet)
-Zaphira
La idea es que
1)ReyArturo cree humanos (distintos) y se los pase al Set Soldados.
2)ReyArturo tenga un metodo para sacar soldados del Set.
3)Zaphira tambien pueda sacar soldados del set pero viendo cual es el mas poderoso y morfarselo.
Mas o menos tengo una idea de como hacer (3).Pero no tengo ni la menor idea de como hacer (1) y (2).
Este fue mi primer intento de solucion,o sea:crear dos objetos mas (Romulo y Remo) que le iba a pasar al set.(Aca zaphira no esta creada porque nisiquiera meti elementos en el set).
http://www.imagebanana.com/view/jjfb8n1k/Pantallazo.png
Despues otra solucion fue crear humanos y setearlo que,como me dijiste no es algo valido.
Rey arturo tiene definida la variable soldados adentro que en un momento le habia agregado el objeto humanos haciendo soldado:=humano y asi.
No se si se entiende un poco mejor esto.(hasta yo medio como que me hize un bolonqui).
El object explorer muestra instancias (hasta donde recuerdo). Cuando un objeto está precedido por el artículo, eso significa que es una instancia.
Si tenés la clase Humano una instancia sería unHumano.
En tu caso, cuando tenés aSet es una instancia de la clase Set, anObject es una instancia de otra clase que podría ser Object, etc.
¿Tenés el anunciado ahí a mano?
Pregunta: ¿Qué es megasaphira? ¿Otro objeto?
Mucho no entendí tampoco, pero a ver que onda esto:
Definiendo estos métodos al ReyArturo
asignarSoldados: coleccionSolados
soldados:= coleccionSoldados.
agregarHumano: unHumano
soldados add: unHumano.
sacarSoldado: unSoldado
soldados remove: unSoldado.
Entonces ponele que tenés los Objetos: Romulo y Remo (que son humanos) y losSoldados (que seria la colección)
ReyArturo asignarSoldados: losSoldados.
ReyArturo agregarHumano: Romulo.
losSoldados size. (deberia devolverte 1)
ReyArturo agregarHumano: Remo.
losSoldados size. (deberia devolverte 2)
ReyArturo sacarSoldado: Romulo.
losSoldados size. (deberia devolverte 1)
ReyArturo sacarSoldado: Remo.
losSoldados size. (deberia devolverte 0)
No se si interpreté mal lo que tenés que hacer y mandé fruta
Ojala sirva
PD: Yo habia hecho algo de esto la última clase pero con colección bag y ordered..
(22-04-2011 01:43)LeaTex escribió: [ -> ]El object explorer muestra instancias (hasta donde recuerdo). Cuando un objeto está precedido por el artículo, eso significa que es una instancia.
Si tenés la clase Humano una instancia sería unHumano.
En tu caso, cuando tenés aSet es una instancia de la clase Set, anObject es una instancia de otra clase que podría ser Object, etc.
¿Tenés el anunciado ahí a mano?
Pregunta: ¿Qué es megasaphira? ¿Otro objeto?
megasaphira es el nombre que le das al workspace cuando lo creas,ni le des bola
.
El enunciado es este:
El tp debería cubrir los siguientes puntos (el workspace se entrega).
1) soldados vivos
2) poder total del ejército
3) carne de canión (obtener un soldado vivo para sacrificar)
4) cometeUno: - A saphira le pasamos un conjunto de soldados sin repetidos y ella elije al más poderoso para morfar
O sea,crea soldados vivos,calculame el poder total del ejercito (segun entendi con un inject into+sum se resuelve) dame un soldado del set y que saphira pueda sacar un soldado del set que sea el mas poderoso.
Cita:Mucho no entendí tampoco, pero a ver que onda esto:
Definiendo estos métodos al ReyArturo
Gracias,mañana capaz lo pruebo a ver que onda,pero creo que la idea es no crear 20mil soldados como estaba haciendo yo.
(22-04-2011 03:28)rulo escribió: [ -> ]Gracias,mañana capaz lo pruebo a ver que onda,pero creo que la idea es no crear 20mil soldados como estaba haciendo yo.
Si los soldados no tienen que ser objetos, fijate pasandole strings 'Romulo' o 'Remo' o 'NombreDelSoldadoQueQuieras' (supongo)
losSoldados removeAll. (esto hacelo siempre cuando estés probando en el workspace por las dudas)
ReyArturo agregarHumano: 'Rulo'.
losSoldados size. (debería devolverte 1)
(22-04-2011 11:23)batty escribió: [ -> ] (22-04-2011 03:28)rulo escribió: [ -> ]Gracias,mañana capaz lo pruebo a ver que onda,pero creo que la idea es no crear 20mil soldados como estaba haciendo yo.
Si los soldados no tienen que ser objetos, fijate pasandole strings 'Romulo' o 'Remo' o 'NombreDelSoldadoQueQuieras' (supongo)
tienen que ser objetos porque deben tener un nivel de fuerza.
Bueno, el objeto ReyArturo tendría una variable soldados y sería así:
agregarSoldado: unaPersona
soldados add: unaPersona
carneDeCanion
^soldados remove: (soldados anyOne)
poderDelEjercito
^soldados
inject: 0
into: [:sum :unSoldado | sum + (unSoldado poder)]
sacarSoldado: unaPersona
^soldados remove: unaPersona
soldados: aSet
soldados := aSet
El objeto Soldado sería así:
setearNombre: unString poder: unNumero hp: unObjeto
nombre := unString.
poder := unNumero.
hp := unObjeto
poder
^poder
Entonces en un workspace podés hacer:
ReyArturo soldados: Soldados.
ReyArturo agregarSoldado: (Soldado setearNombre: 'Romulo' poder: 100 hp: 1 ).
ReyArturo poderDelEjercito.
ReyArturo carneDeCanion.
Che,pero Soldado no lo tenes que declarar como un set?.
Porque cuando ejecuto:
Cita:ReyArturo agregarSoldado: (Soldado setearNombre: 'Romulo' poder: 100 hp: 1 ).
Me tira aNObject no entiende el mensaje add:aNObject.Porque smallltalk no sabe que lo queres hacer set y lo usa como un objeto comun.
Hice lo que puso LeaTex y funca bien, excepto lo de carneDeCanion que me devuelve "anObject" no se si esa es la idea
Lo hice asi, con un objeto más para probar (Soldado2)
Referencias:
Soldados (Set)
Soldado (Objeto)
Soldado2 (Objeto)
ReyArturo (Objeto)
Workspace:
ReyArturo soldados: Soldados. {le asigna a ReyArturo el Set donde van a estar los Soldados}
ReyArturo agregarSoldado: (Soldado setearNombre: 'Romulo' poder:100 hp:1 ). {asigna las variables al Soldado}
ReyArturo agregarSoldado: (Soldado2 setearNombre: 'Remo' poder:120 hp:1 ). {asigna las variables al Soldado2}
ReyArturo poderDelEjercito. {me devuelve: 240}
ReyArturo carneDeCanion. {me devuelve: anObject
}
Si,ahora me funciona,mil gracias leatex!
¿Ahora,para agregar otro soldado SI O SI,hay que tener otro objeto no?
Bueno,de todas formas gracias \[-->00\].
(eso que esta arriba intenta ser un infinito):
cuando trabajan con el object browser, están usando instancias. para crear soldados necesitarían un "modelo", es decir, una Clase, y eso no lo tienen ahí.
entonces cada soldado que quieran tener lo tienen que crear como objeto en el object browser.
carneDeCanion les devuelve anObject si hacen un "print it" pero si hacen un "inspect it" se van a dar cuenta que no es cualquier object, es un Soldado.
si quieren verlo mejor, en lugar de crear los objetos Soldado1, Soldado2, etc, pueden crear Romulo, Remo, etc.