|
Página 1 de 1
|
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
Por defecto tenemos ampliado en la clase hija Administrativo este método de esta forma:
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
|
#1 Miercoles, 07 Febrero 2018, 13:44 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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.
|
#2 Miercoles, 07 Febrero 2018, 20:34 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#3 Viernes, 09 Febrero 2018, 10:13 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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:
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
|
#4 Viernes, 09 Febrero 2018, 14:34 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Herencia Entre Clases
Julio:
Citar:
No lo he probado, pero creo que se hace así:
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:
Clase Perro:
Clase Pájaro:
Main:
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"
|
#5 Sabado, 10 Febrero 2018, 00:46 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
¿ Adecuada ?. Funciona.
Saludos
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 |
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 |
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
|
#6 Sabado, 10 Febrero 2018, 01:10 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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.
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 |
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 |
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 |
|
#7 Domingo, 11 Febrero 2018, 19:50 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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.
Ejemplo: Clase Trabajador, que en este caso es padre.
Esta es la clase Personal:
Y esto puede ser el Main o FMain:
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
|
#8 Lunes, 12 Febrero 2018, 13:02 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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.
|
#9 Lunes, 12 Febrero 2018, 14:25 |
|
|
|
Temas parecidos
Temas parecidos
Tema |
Autor |
Foro |
Respuestas |
último mensaje |
|
Herencia De Clases
|
Alaplancha |
General |
7 |
Sabado, 20 Octobre 2012, 18:10 fabianfv |
|
Un Detalle De La Herencia Entre Clases Y P...
|
jsbsan |
General |
14 |
Sabado, 27 Septiembre 2014, 10:29 Shell |
|
Herencia, Me, Super..
|
Shell |
General |
5 |
Martes, 21 Julio 2015, 00:30 Shell |
|
Duda Con Herencia En Gambas3
|
sulky16v2 |
General |
2 |
Martes, 12 Abril 2016, 13:19 Invitado |
|
Página 1 de 1
|
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
|
|
|
|
|