Herencia Entre Clases


Subject: 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

Last edited by Shell on Wednesday, 07 February 2018, 13:47; edited 1 time in total
Subject: 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.

Subject: 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

Last edited by Shell on Friday, 09 February 2018, 10:21; edited 4 times in total
Subject: 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

Subject: 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

Subject: 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

Last edited by Shell on Saturday, 10 February 2018, 01:14; edited 1 time in total

PruebaPolimorfismo.tar.gz
Description: Ejemplo de polimorfismo dentro de un método de la clase padre 
Download
Filename: PruebaPolimorfismo.tar.gz
Filesize: 11.95 KB
Downloaded: 26 Time(s)
PruebaPolimorfismo.tar.gz
Description: Ejemplo de polimorfismo dentro de un método de la clase padre 
Download
Filename: PruebaPolimorfismo.tar.gz
Filesize: 11.95 KB
Downloaded: 26 Time(s)
PruebaPolimorfismo.tar.gz
Description: Ejemplo de polimorfismo dentro de un método de la clase padre 
Download
Filename: PruebaPolimorfismo.tar.gz
Filesize: 11.95 KB
Downloaded: 26 Time(s)

Subject: 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
Description: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Download
Filename: ProbandoMe-0.0.1.tar.gz
Filesize: 11.35 KB
Downloaded: 31 Time(s)
ProbandoMe-0.0.1.tar.gz
Description: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Download
Filename: ProbandoMe-0.0.1.tar.gz
Filesize: 11.35 KB
Downloaded: 31 Time(s)
ProbandoMe-0.0.1.tar.gz
Description: Ejemplo de uso de llamadas a metodos redefinidos en las clases hijas (o herederas) 
Download
Filename: ProbandoMe-0.0.1.tar.gz
Filesize: 11.35 KB
Downloaded: 31 Time(s)

Subject: 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

Last edited by Shell on Monday, 12 February 2018, 13:28; edited 1 time in total
Subject: 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.


Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1569s (PHP: 23% SQL: 77%)
SQL queries: 29 - Debug Off - GZIP Enabled