|
Página 1 de 2
|
Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Autor |
Mensaje |
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Hoy me he encontrado con un escollo que al final he resuelto...
Os cuento:
Tendo una clase "Padre" y luego una clase "Hijo" que hereda de la clase "Padre:
El código de la clase "Padre" es el siguiente:
Y el de la clase Hijo es el siguiente:
Como veis, lo que hago es redefinir el método familiar()
Bien cuando ejecuto este código:
¿que pensais que debería escribirse, siendo persona unas instancia de la clase Hijo?
última edición por jsbsan el Jueves, 25 Septiembre 2014, 16:19; editado 1 vez
|
#1 Jueves, 25 Septiembre 2014, 16:16 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Hola soy tu hijo, supongo. Aunque si así fuese no habrías abierto el hilo....
Espero que no devuelva eso de : "¡Ah! ¿El hermano feo de Obi Wan Kenobi?"
|
#2 Jueves, 25 Septiembre 2014, 17:42 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Shordi:
Citar: Hola soy tu hijo, supongo. Aunque si así fuese no habrías abierto el hilo....
Efectivamente.... no devuelve "tu hijo", sino "tu padre"....
Yo pensaba devolveria "tu hijo", al usar el método familiar() definido en la clase hijo, pero no es asi.....devuelve "tu padre", ya que usa el método familiar() definido en la clase padre....
¿en que falla el código y como hacer que devuelva lo correcto? (reto a la vista)
|
#3 Jueves, 25 Septiembre 2014, 18:32 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Hola!.
Debes cambiar el código de mensaje en la clase Padre.
Me devuelve la referencia al objeto actual.
Jorge:
¿ Quien era el hermano de Obi Wan ?. Los hermanos de la trilogía (ja!) ya tu sabes quienes eran, los que buscaba el padre por un caso de custodia.
Pues espera que la cosa no ha quedado ahí!. No te puedes imaginar....
Remenes
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Jueves, 25 Septiembre 2014, 19:06 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Shell:
Citar: texto = "Hola, yo soy ... " & Me.familiar()
Efectivamente, esa es la solución.
Lo que yo creo que pasa, es que el interprete de gambas, busca en el archivo de la clase donde este leyendo el código el método familiar(), y no usa el metodo que tiene definido en el objeto, amenos que lo "fuerzes" usando "Me"
En este caso "Me" es el objeto actual (el que es de la clase "hijo"), y cuando le dices Me.Familiar(), usa el método familiar() que esta definido en la clase hijo, si no lo encuentrara, pasaria a usar el método familiar() definido en la clase padre.
Nota:
Me gustaria saber, este mismo código traducido en Python...
|
#5 Jueves, 25 Septiembre 2014, 19:29 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Hola Julio.
Cuando hicimos el curso de introducción de Python, no vimos la herencia.
Pero creo que esto te puede valer. No sé si se puede mejorar.
class Padre:
def mensaje(self):
return ("Hola, yo soy ..." + self.familiar())
def familiar(self):
return ("tu padre")
class Hijo(Padre):
def familiar(self):
return ( "tu hijo")
persona = Hijo()
print (persona.mensaje())
persona2 = Padre()
print (persona2.mensaje())
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
última edición por Shell el Jueves, 25 Septiembre 2014, 20:19; editado 1 vez
|
#6 Jueves, 25 Septiembre 2014, 20:19 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
En este caso "Me" es el objeto actual (el que es de la clase "hijo"), y cuando le dices Me.Familiar(), usa el método familiar() que esta definido en la clase hijo, si no lo encuentrara, pasaria a usar el método familiar() definido en la clase padre.
Y si quieres usar (reimplementar) explícitamente el método de la clase Padre deberías usar Super:
http://gambaswiki.org/wiki/lang/super?l=es&w
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#7 Viernes, 26 Septiembre 2014, 13:05 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Super se utiliza más para extender el método padre. Si quieres hacer algo antes de que el método se dispare, colocas tu código primero y luego llamas a super.método() o al revés, primero lo llamas y luego haces lo que necesites, pero no creo que tenga que ver con esa necesidad explícita de mencionar la pertenencia de familiar(), en este caso.
Saludos.
|
#8 Viernes, 26 Septiembre 2014, 16:48 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Hola
Citar: Super devuelve una referencia al objeto actual que empleará la implementación de los símbolos de la clase padre.
Lo que yo entiendo es que si tienes una clase heredada (hija) en la que re-implementas un método de la clase padre (ambos métodos se llaman igual aunque pueden hacer cosas distintas) debes usar Super en la clase hija para usar el método de la clase padre.
Puede que el fallo que le ha pasado a Julio no siempre suceda del mismo modo, entonces la única forma de asegurarte es usando Me o Super según convenga.
Al menos eso es lo que yo entiendo de la descripción en la ayuda de gambas y que es fácilmente comprobable mediante el ejemplo proporcionado. Otros usos pueden ser posibles, aunque no se me ocurre ninguno ahora mismo...
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#9 Viernes, 26 Septiembre 2014, 17:02 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Quizá estemos diciendo lo mismo con distintas palabras.
Lo que yo quiero indicar es que usando super disparas el método de la clase padre, pero eso no tiene sentido salvo cuando quieres extender las capacidades de dicho método. El ejemplo que has puesto y que transcribo es perfecto (amén de que da otra solución al eterno tema de mostrar un campo en el listbox y almacenar la clave del registro de alguna manera).
En él lo que hacemos es llamar al método Add de la clase padre, puesto que lo que tal método hace nos vale perfectamente y además guardar las claves en el array de claves. Si no dispusiésemos de super, todo lo que el evento Add hace en la clase padre -a saber, añadir un elemento tipo string a la propiedad List- lo tendríamos que reescribir en la clase hija:
El ejemplo de Julio es distinto, por cuanto el método familiar() reescribe por completo el método de la clase padre.
No se si me explico o me he pasado con el vino en la merienda...
última edición por shordi el Viernes, 26 Septiembre 2014, 18:36; editado 1 vez
|
#10 Viernes, 26 Septiembre 2014, 18:35 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|