Buenas! Gracias por su pronta respuesta en la consulta anterior, he chocado con una nueva pared en el desarrollo del TP. Elegí resolver uno de los problemas de manera polimórfica y terminé con una clase que hereda de otra.
Clase hija -----|> Clase madre
El problema es que cuando uso la nueva clase (aquella que hereda de su madre) en mis pruebas Pharo no me reconoce los mensajes de su madre, el mensaje que muestra es "Instance of ClaseHija did not understand #eseMensaje" y eseMensaje es un mensaje concreto y definido en ClaseMadre
No se si quizás las declaré mal cuando la cree, pero en el visor de clases de Pharo las tengo como
Clase Madre
Clase Hija
y en el panel como ClaseMadre subclass: ClaseHija
lo cual me dio a entender que esa "hija" si hereda de "madre" (por estar indentada)
¿Redefino eseMensaje en la Clase Hija? - Me huele mal hacerlo si no necesito ninguna diferencia respecto del de la clase madre
Hola Lorenzo:
En lo que mencionás no parece haber ningún error, salvo quizás esta parte:
ClaseMadre subclass: #ClaseHija
instanceVariableNames: ''
classVariableNames: ''
package: 'TP1'
Fijate que tiene que haber un numeral antes del nombre de la clase en su declaración. Si en ClaseMadre implementás un método esteMensaje entonces ClaseHija también lo tiene que conocer, si está declarada de esta manera. No necesitás volver a definir eseMensaje en la clase hija a menos que quieras que tenga un comportamiento distinto.
Si aún así no se resuelve te recomiendo probar con clases más sencillas fuera del TP1 para tratar de replicar el error.
Aprovecho para insistir en que no es necesario aplicar herencia para usar polimorfismo en Smalltalk.
Saludos,
Tomás
Hola!
El # faltante me lo comí tipeandolo acá, pero en el Pharo está escrito. Y cuando veo en el panel el "árbol de herencia" de la clase hija lo muestra correctamente de Object --> (..) ---> Clase Madre ----> Clase Hija
El mensaje en cuestión devuelve un atributo de clase madre. ¿Tendrá eso algo que ver? - en un principio pensé que no porque cuando quise redefinirle esos atributos a la clase hija Pharo me avisó que ya existían.
Evitaría la herencia pero en este momento no concibo una solución que resuelva mejor este problema.
Gracias nuevamente
No. Al aplicar herencia heredás tanto los métodos como los atributos. El problema debe estar en alguna otra parte que no estás pudiendo ver. Te recomiendo que pruebes modelar clases simples con herencia fuera del TP1 y ver si sucede lo mismo. En ese caso podés compartir el código en el foro sin problemas. Hay muchos ejemplos en la guía de ejercicios.
Por otro lado, más allá de este error, y en relación a lo que recomendé al final de mi mensaje anterior, recordá que lo que te resuelve la herencia en Smalltalk es la repetición de código al poner en una única clase cierto comportamiento común a otras clases. Solo ahí se justifica que uses esa relación (se debe cumplir además la regla de "es un" obviamente). Desconozco si este es tu caso o no pero solamente quiero insistir en que no es necesario usar herencia para aplicar polimorfismo. ¿Está mal? No necesariamente, dependerá de cada caso, pero la justificación para usar herencia nunca debe ser para aplicar polimorfismo, por más tentador que sea crear una clase madre Animal para Perro y Gato. Perro y Gato pueden ambos entender el mensaje eseMensaje y responder de manera distinta a él y, ¡chau pinela, ahí ya tenés polimorfismo!
Por las dudas repito: En Smalltalk no es necesario usar herencia para aplicar polimorfismo.
Saludos,
Tomás
PD: En Smalltalk no es necesario usar he... etc.
Entiendo. Pero justo la claseHija es indefectiblemente una claseMadre. Una alternativa polimórfica sería copiar todo el código de clase madre "a mano", yo no tengo ningún problema, ni siquiera son tantos métodos, ¿pero como lo defiendo en el informe? ¿qué pongo en el diagrama de clases? ¿"Se que debería ser heredada pero Pharo no me las reconoció"?
No, son asuntos distintos. Por un lado está el problema en tu código que no te está reconociendo el método heredado. Eso no es culpa de Pharo, ahí hay algo mal en alguna parte de tu código y por supuesto no es aceptable que en el informe pongas algo como "Acá quise hacer herencia pero no me salió porque Pharo es malo malo y encima feo. Aguante C, vieja, no me importa nada".
¿Probaste aplicando herencia en otras clases? ¿Te pasa lo mismo también ahí o es solamente en este caso donde te pasa? Te recomiendo modelar una situación más simple fuera del TP1 para tratar de ver dónde está el problema. Seguramente es algún detalle que se te pasó por alto.
Lo otro que te mencionaba es simplemente una recomendación de diseño no relacionada con este bug que estás teniendo debido al ruido que me genera la terminología que estás usando. Por más que claseHija sea indefectiblemente una claseMadre no por eso debés aplicar herencia (poder podés, pero no necesariamente debés. Es algo completamente independiente del concepto de polimorfismo.
¡Es que Pharo es malo malo! Con otras clases pude, parece ser un error de constructores de clase, pero el tdd se me fue al demonio por corregir este error.
Muchas gracias por tus correcciones!
Saludos
Si no te sale mandame el File Out por mail y lo reviso.