Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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:

' gambas class file

Public Function mensaje() As String

  Dim texto As String

  texto = "Hola, yo soy ... " & familiar()

  Return texto

End

Public Function familiar() As String

  Return "tu padre"

End
 


Y el de la clase Hijo es el siguiente:

' gambas class file

Inherits Padre

Public Function familiar() As String

  Return "tu hijo"

End

Como veis, lo que hago es redefinir el método familiar()

Bien cuando ejecuto este código:
Public Sub Form_Open()

  Dim persona As New Hijo

  Print persona.mensaje()

End


¿que pensais que debería escribirse, siendo persona unas instancia de la clase Hijo?
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Jueves, 25 Septiembre 2014, 17:19; editado 1 vez 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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?"
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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)
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.

Public Function mensaje() As String

Dim texto As String

texto = "Hola, yo soy ... " & Me.familiar()

Return texto

End
 


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
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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...
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
última edición por Shell el Jueves, 25 Septiembre 2014, 21:19; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Detalle De La Herencia Entre Clases Y Prioridad De Uso De Métodos 
 
jsbsan escribió:  


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"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:

' MyListBox class
INHERITS ListBox

PRIVATE $cPos AS NEW Collection
PRIVATE $aKey AS NEW String[]
...

' Reimplements the Add method
PUBLIC SUB Add(Text AS String, Key AS String, OPTIONAL Pos AS Integer = -1)

  ' Adds the item to the list box
  SUPER.Add(Text, Key, Pos)
  ' Adds the key to key array
  IF Pos < 0 THEN
    $cPos.Clear
    $cPos[Key] = $aKey.Count
    $aKey.Add(Key)
  ELSE
    $aKey.Add(Key, Pos)
  ENDIF

END
 


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, 19:36; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Herencia De Clases Alaplancha General 7 Sabado, 20 Octobre 2012, 19:10 Ver último mensaje
fabianfv
No hay nuevos mensajes WebRTC Un Proyecto De Alta Prioridad Dela FSF tincho General 4 Jueves, 28 Enero 2016, 22:58 Ver último mensaje
tincho
No hay nuevos mensajes Métodos Especiales Shell General 2 Lunes, 16 Enero 2017, 01:03 Ver último mensaje
Shell
No hay nuevos mensajes Métodos Line Input Y Readline Shell General 3 Lunes, 27 Octobre 2014, 01:52 Ver último mensaje
vuott
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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
No puede descargar archivos
No puede publicar eventos en el calendario