Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Herencia Entre Clases
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Herencia Entre Clases 
 
Buenas!.

Repasando un poco gambas, estuve viendo un ejemplo de nuestro compañero Julio.
( Tampoco se si me repito ).
En el que se tiene una clase padre:

- Personal

Y luego clases hijas:

- Administrativo
- Docente
- Limpiador

Si la clase padre tiene un método común como es "Consultar" para poder ver, ya sea el nombre, el sueldo mensual.
Las clases hijas usan este método y se le añade por ejemplo, un departamento concreto para el administrativo.

A lo que voy es que creo que se podía minimizar un poco el código de ese "método común" en cada una de las clase hija.
 
Este el método "Consultar" de la clase padre:

Public Sub Consultar()
  
  Print "Consultar datos...."
  Print "Nombre: " & hnombre
  Print "Sueldo: " & Sueldo()
  Print "-----------------------------"
  
End
 


Por defecto tenemos ampliado en la clase hija Administrativo este método de esta forma:

Public Sub Consultar()
  
  Print "Consultar datos...."
  Print "Nombre: " & Super.nombre
  Print "Sueldo: " & Super.Sueldo()
  Print "Area de trabajo: " & harea
  Print "------------------------------"
  
End
 


Pero, ¿ y si hacemos esto en el método de la clase administrativo ?.

Public Sub Consultar()

  Super.Consultar()  
  Print "Area de trabajo: " & harea
'  Print "------------------------------"
  
End
 


Tendríamos que modificar o tener un procedimiento exclusivo para mostrar las líneas
y llamarlo desde Consultar. Creo que en parte se ha reducido algo de código, ¿ no ?.  

Vaya ahora no encuentro el enlace del ejemplo. Sería de importancia que en los ejemplos de los blogs se le añadiera
la fuente del enlace.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Miercoles, 07 Febrero 2018, 13:47; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Herencia Entre Clases 
 
Shell:

Un problema que se puede plantear con tu código reducido, es que cada clase "hija", tenga su propia forma de calcular el sueldo, entonces ya no vale como lo expones.
 




===================
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: Herencia Entre Clases 
 
Julio:

En tu ejemplo usabas una función en la rutina principal en la que usabas polimorfismo.

Public Sub mostrar(per As Personal)
  
  Print "********************************************************"
  Print "Usando una función que recibe cualquier clase de persona"
  Print "********************************************************"
  per.Consultar()
  
End
 


Hice un ejemplo parecido en Python. Y encontré la posibilidad de hacerlo de dos formas distintas.
Una es usando una función como la de arriba y pasandole como parámetro un objeto que herede de la clase padre.
Pero hay otra forma que en gambas no he podido lograr.  Creé una clase padre trabajador por llamarla de alguna forma
y en ella se aplica el polimorfismo.

Esta clase padre Trabajador tiene un método "Consultar" en la que se llama al método común
"InformeTrabajador" de las clases hijas. Me ha sido imposible hacer algo parecido en Gambas.
Ya que la clase padre Trabajador carece del método "InformeTrabajador".


#!/usr/bin/python3

# Herencia entre clases

class Trabajador:

    def __init__(self, nombre, sueldomensual):
        self.nombre = nombre
        self.sueldomensual = sueldomensual

    def getnombre(self):
        return self.nombre

    def getsueldomensual(self):
        return self.sueldomensual

    def Consultar(self):
        self.InformeTrabajador()        

class Personal(Trabajador):
    
    def InformeTrabajador(self):
        print ('Consultar datos...')
        print ('Nombre: {0}'.format(self.getnombre()))
        print ('Salario: {0}€'.format(self.getsueldomensual()))        

class Administrativo(Trabajador):

    def __init__(self, nombre, sueldomensual, area):
        super().__init__(nombre, sueldomensual)
        self.area = area

    def getarea(self):
        return self.area

    def InformeTrabajador(self):
        print ('Consultar datos...')
        print ('Nombre: {0}'.format(self.getnombre()))
        print ('Salario: {0}€'.format(self.getsueldomensual()))
        print ('Area: {0}'.format(self.getarea()))

def main():
    pedro = Personal(nombre = 'Pedro', sueldomensual = '600')
    pedro.Consultar()
    print ('---------')
    maria = Administrativo(nombre = 'Maria', sueldomensual = '800', area = 'Administración general')
    maria.Consultar()

if __name__=='__main__': main()
 


No sé si es posible en gambas lograr hacer eso de alguna manera.
De todas formas también he visto en Python usar el sistema de la función.
Así que puede que según la versión de este haya cambiado la forma.

¿ Has visto en Java esa posibilidad ?.

El self de Python es una referencia a la instancia del objeto dentro del método.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Viernes, 09 Febrero 2018, 10:21; editado 4 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Herencia Entre Clases 
 
Shell:
Citar:
No sé si es posible en gambas lograr hacer eso de alguna manera.

def Consultar(self):
        self.InformeTrabajador()


No lo he probado, pero creo que se hace asi:
public sub Consultar()
        me.InformeTrabajador()
end


Citar:
El self de Python es una referencia a la instancia del objeto dentro del método.

Creo que eso mismo hace el ME
http://gambaswiki.org/wiki/lang/me?l=es
 




===================
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: Herencia Entre Clases 
 
Julio:

Citar:

No lo he probado, pero creo que se hace así:


public sub Consultar()
        me.InformeTrabajador()
end
 


Eso es lo que hice.  

Como esta dentro de la clase, supongo que intentará en gambas buscar ese método dentro de la clase.
El cual no existe. Dando símbolo desconocido en la clase.

Te propongo un ejemplo más sencillo:

Clase Padre: Animal
Clases Hijas: Perro, Pájaro

Clase Animal:

Public Sub Desplazar()
  
  Me.mover()
  
End
 


Clase Perro:

Inherits Animal

Public Sub Mover()
  
  Print "Se desplaza a cuatro patas"
  
End
 


Clase Pájaro:
Inherits Animal

Public Sub Mover()
  
  Print "Se desplaza con alas"
  
End
 


Main:

Public Sub Main()

  Dim unperro As New Perro
  Dim unpajaro As New Pajaro
    
  unpajaro.Desplazar()
    
End
 


Es el mismo error, con un código algo más simple.
Algo que aparentemente puede chocar es que si usas desde Main,
ejemplo el objeto unpajaro.

Vas a ver tanto el método de la clase Padre heredado como el de la clase Pajaro.
Entonces puede que nos preguntemos, ¿ qué sentido tiene llamar al método de la clase padre ?
si va a hacer prácticamente lo mismo en este caso. Habrá casos más complejos.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Herencia Entre Clases 
 
Creo que he dado con la solución. Usando el ejemplo de los animales.
Podemos usar en el método de la clase padre esto:

Public Sub Desplazar()
  
  'Me.mover()
  
  Object.Call(Me, "Mover")
  
End
 


¿ Adecuada ?.  Funciona.


Saludos

PruebaPolimorfismo.tar.gz
Descripción: Ejemplo de polimorfismo dentro de un método de la clase padre 
Descargar
Nombre del archivo: PruebaPolimorfismo.tar.gz
Tamaño: 11.95 KB
Descargado: 25 veces
PruebaPolimorfismo.tar.gz
Descripción: Ejemplo de polimorfismo dentro de un método de la clase padre 
Descargar
Nombre del archivo: PruebaPolimorfismo.tar.gz
Tamaño: 11.95 KB
Descargado: 25 veces
PruebaPolimorfismo.tar.gz
Descripción: Ejemplo de polimorfismo dentro de un método de la clase padre 
Descargar
Nombre del archivo: PruebaPolimorfismo.tar.gz
Tamaño: 11.95 KB
Descargado: 25 veces

 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Sabado, 10 Febrero 2018, 01:14; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Herencia Entre Clases 
 
Shell:

Citar:
Como esta dentro de la clase, supongo que intentará en gambas buscar ese método dentro de la clase.
El cual no existe. Dando símbolo desconocido en la clase.

Si, pero en la clase padre, tienes que definir el método "informetrabajador()"
Por ejemplo:
Public Sub cosultar()

  Me.informeTrabajador()

End

Public Sub informeTrabajador()

  'lo dejo vacio, ya que será definida por las clases "herederas"

End
 


Y asi, si reconoce el metodo "informetrabajador"

Te dejo el codigo completo.

ProbandoMe-0.0.1.tar.gz
Descripción: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Descargar
Nombre del archivo: ProbandoMe-0.0.1.tar.gz
Tamaño: 11.35 KB
Descargado: 29 veces
ProbandoMe-0.0.1.tar.gz
Descripción: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Descargar
Nombre del archivo: ProbandoMe-0.0.1.tar.gz
Tamaño: 11.35 KB
Descargado: 29 veces
ProbandoMe-0.0.1.tar.gz
Descripción: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Descargar
Nombre del archivo: ProbandoMe-0.0.1.tar.gz
Tamaño: 11.35 KB
Descargado: 29 veces

 




===================
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: Herencia Entre Clases 
 
Julio:

Citar:

Si, pero en la clase padre, tienes que definir el método "informetrabajador()"


No, creo que si haces esto solamente en la clase padre es suficiente.

Public Sub Consultar()
  
  Object.Call(Me, "InformeTrabajador")
  
End
 


 

Ejemplo: Clase Trabajador, que en este caso es padre.

Property nombre As String
Private hnombre As String

Property SueldoMensual As String
Private hsueldoMensual As String

' Lectura y escritura de valores de propiedades

Private Function nombre_Read() As String
  
  Return hnombre
  
End

Private Sub nombre_Write(Value As String)
  
  hnombre = Value
  
End

Private Function SueldoMensual_Read() As String
  
  Return hsueldoMensual
  
End

Private Sub SueldoMensual_Write(Value As String)
  
  hsueldoMensual = Value
  
End

' Declaramos los metodos

Public Sub Consultar()
  
  Object.Call(Me, "InformeTrabajador")
  
End

Public Function Sueldo() As String
  
  Return Subst$("El sueldo de una persona es de &1", hsueldoMensual & "€")
  
End

Public Sub Registrar(nombre As String, sueldo As Single, Optional valor1 As Variant, Optional valor2 As Variant)
  ' Nombre como Cadena, sueldo como Single
  
  hnombre = nombre
  hsueldoMensual = sueldo  
  
End
 


Esta es la clase Personal:

Inherits Trabajador

' Declaramos los metodos

Public Sub InformeTrabajador()
  
  Print "Consultar datos...."
  Print "Nombre: " & Me.nombre
  Print "Sueldo: " & Me.Sueldo()
  Print "-----------------------------"
  
End

'Se puede eliminar
Public Function Sueldo() As String
  
  Return Subst$("El sueldo de una persona es de &1", Me.SueldoMensual & "€")
  
End
 


Y esto puede ser el Main o FMain:

Public Sub Form_Open()
  
  Dim per1 As New Personal
 
  With per1
    .Registrar("Juan", 100)
    .Consultar()
  End With
    
End
 


En este caso el método Sueldo de Personal sobra ya que es exactamente igual al de la clase padre, no es necesario.
A menos que tenga alguna variación y sustituya al método de la clase padre.


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 12 Febrero 2018, 13:28; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Herencia Entre Clases 
 
Shell:

Citar:
  
  Object.Call(Me, "InformeTrabajador")
 


Esa es otra forma de hacerlo,Shell, pero creo que es menos intuitivo. En el ide, mientras escribes, puedes ver los metodos que tienes la clase.
 




===================
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
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Herencia De Clases Alaplancha General 7 Sabado, 20 Octobre 2012, 18:10 Ver último mensaje
fabianfv
No hay nuevos mensajes Un Detalle De La Herencia Entre Clases Y P... jsbsan General 14 Sabado, 27 Septiembre 2014, 10:29 Ver último mensaje
Shell
No hay nuevos mensajes Herencia, Me, Super.. Shell General 5 Martes, 21 Julio 2015, 00:30 Ver último mensaje
Shell
No hay nuevos mensajes Duda Con Herencia En Gambas3 sulky16v2 General 2 Martes, 12 Abril 2016, 13:19 Ver último mensaje
Invitado
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

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



  

 

cron