Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Herencia, Me, Super..
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Herencia, Me, Super.. 
 
Hola!.

Uno de los capítulos del curso de gambas de nuestro compañero Jsbsan trata sobre la herencia, Me y el método super.

Herencia, Me, Super

He modificado el ejemplo, tengo una clase padre soldado y dos clases hijas, fusilero y ametrallador

Tanto la clase hija fusilero y ametrallador heredan todos los métodos de la clase padre soldado.
Con la variación de que el arma (propiedad) puede ser un fusil o una ametralladora.

En cada clase hija el método efectuardisparo es propio de cada clase hija, en este caso son parecidos.

Tenemos la clase padre soldado:

Private $arma As String
Property arma As String

Private $desarmado As Boolean
Property desarmado As Boolean

Public Sub Dispara()
    
  Print "Me preparo para disparar con.. " & Me.arma
  'EfectuarDisparo()
  Me.EfectuarDisparo()

End

Public Sub EfectuarDisparo()
  
     Print "Se ha disparado " & Me.arma
    
End

Public Sub QuitarArma()
  
  Me.desarmado = True
  Me.arma = "piedra"
  Print "Está desarmado"
  
End

Private Function arma_Read() As String
  
  Return $arma
  
End

Private Sub arma_Write(Value As String)
  
  $arma = Value
  
End
Private Function desarmado_Read() As Boolean

  Return $desarmado  

End

Private Sub desarmado_Write(Value As Boolean)

  $desarmado = Value

End
 


La clase hija ametrallador:

Inherits Soldado

Public Sub _new()
  
  Me.arma = "metralleta"
  
End

Public Sub EfectuarDisparo()
  
  If Not Me.desarmado Then
    Print "Se ha disparado a rafagas"
  Else
    Super.EfectuarDisparo()
  Endif
  
End
 


Y la clase hija fusilero:

Inherits Soldado

Public Sub _new()  
  
  Me.arma = "fusil"  
  
End

Public Sub EfectuarDisparo()
  
  If Not Me.desarmado Then
    Print "Se ha disparado un solo disparo."
  Else
    Super.EfectuarDisparo()
  Endif
  
End
 


En el modulo principal vamos a crear dos objetos de la clase fusilero y ametrallador.
Y haremos que disparen. En el caso del ametrallador, vamos a desarmarlo y tendrá que disparar con una piedra.
( Vaaaale, tendría que haber dicho lanzar..)  

No me di cuenta y puse un nombre parecido al nombre de la clase, pero como está en minúscula ha colado.

Public Sub Main()
  
  Dim fusilero As New Fusilero
  Dim asalto As New Ametrallador
  
  Print fusilero
  fusilero.Dispara()
  
  Print asalto
  asalto.Dispara()
  
  asalto.QuitarArma()
  asalto.Dispara()
  
End
 


La salida del código es:

Citar:

(fusilero 0x9989914)
Me preparo para disparar con.. fusil
Se ha disparado fusil
(Ametrallador 0x998a04c)
Me preparo para disparar con.. metralleta
Se ha disparado metralleta
Está desarmado
Me preparo para disparar con.. piedra
Se ha disparado piedra


Este es el código equivalente en Python3:

#!/usr/bin/python3

class soldado():

    def __init__(self,arma,desarmado = False):
        self.arma = arma
        self.desarmado = desarmado
        

    def dispara(self):
        print ('Me preparo para disparar con.. ' + self.arma)
        self.efectuardisparo()


    def efectuardisparo(self):
        print ('Se ha disparado ' + self.arma)


    def quitarArma(self):        
        self.desarmado = True
        self.arma = 'piedra'
        print ('Está desarmado')
        
class fusilero(soldado):

    def __init__(self):
        super().__init__(arma = 'fusil')
                        
    def efectuardisparo(self):
        if not self.desarmado:
            print ('Se ha disparado un solo disparo.')
        else:
            super(fusilero,self).efectuardisparo()

class ametrallador(soldado):

    def __init__(self):
        super().__init__(arma = 'ametralladora')
        
    def efectuardisparo(self):
        if not self.desarmado:
            print ('Se ha disparado a rafagas.')
        else:
            super(ametrallador,self).efectuardisparo()

            
def main():    
    escopetero = fusilero()
    print (escopetero)
    asalto = ametrallador()    
    escopetero.dispara()
    print (asalto)

    asalto.dispara()
    asalto.quitarArma()
    asalto.dispara()


if __name__=='__main__': main()
 


Y aquí tenéis el código para bajarlo en Gambas:


Saludos

HerenciaSoldado2.tar.gz
Descripción:  
Descargar
Nombre del archivo: HerenciaSoldado2.tar.gz
Tamaño: 5.5 KB
Descargado: 27 veces
HerenciaSoldado2.tar.gz
Descripción:  
Descargar
Nombre del archivo: HerenciaSoldado2.tar.gz
Tamaño: 5.5 KB
Descargado: 27 veces
HerenciaSoldado2.tar.gz
Descripción:  
Descargar
Nombre del archivo: HerenciaSoldado2.tar.gz
Tamaño: 5.5 KB
Descargado: 27 veces

 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 20 Julio 2015, 20:11; 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, Me, Super.. 
 
Vaya...tengo que cambiar un método..sera después de la cena...
 




===================
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, Me, Super.. 
 
Vaya...vaya, no podemos olvidarnos de Me, dentro del método:
Public Sub Dispara()
    
  Print "Me preparo para disparar con.. " & Me.arma
  Me.EfectuarDisparo()
  
End
 


De la otra forma, siempre ejecutaba el método de la clase padre original.
Eso tenéis que cambiarlo para que diga esta vez....

Citar:

(fusilero 0x81e2914)
Me preparo para disparar con.. fusil
Se ha disparado un solo disparo.
(Ametrallador 0x81e304c)
Me preparo para disparar con.. metralleta
Se ha disparado a rafagas
Está desarmado
Me preparo para disparar con.. piedra
Se ha disparado piedra


Solucionado!.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 20 Julio 2015, 20:12; 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, Me, Super.. 
 
Shell:

Esta chulo esto de la herencia, ¿verdad?

A mi, estos ejemplos son los que más me gustan, relacionados con los juegos  
 




===================
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, Me, Super.. 
 
Hola Julio.

Efectivamente, está chulo.
Solo fue leer el ejemplo del curso de gambas y ponerme con el ejemplo. E imaginar como eso era
posible de hacer con Python. Conocía Super en Python con los métodos, pero no con las propiedades.

Luego quise hacerlo lo mismo en gambas. Ahora queda una cuestión:
¿ Y si tuviéramos una clase padre arma y una clase padre soldado ?.

Clase padre : arma
Clases hijas :  fusil,  ametralladora....

Clase padre: soldado

¿ Qué ocurriría con las clases hijas de la clase padre soldado ?.
¿ Seguiríamos teniendo nuestro soldado fusilero o ametrallador ?.

Nuestro objeto soldado sería totalmente independiente de los métodos del arma,
al igual que los métodos  del arma.  Y eso, sin entrar en la herencia de armas.

Se puede complicar bastante.

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, Me, Super.. 
 
Ahora veamos un ejemplo de herencia múltiple, esta vez en Python.
( No me acuerdo si lo he subido alguna vez)

A ver si estudio el tema del patrón delegation en gambas y hago ejemplos parecidos.
El ejemplo es muy sencillo de entender, pero vemos que la herencia múltiple tiene un problema.

# Ejemplo de herencia multiple
# En el caso de que alguna clase padre tuviera métodos con el mismo nombre
# y números de parámetros. Las clases sobrescribirán la implementación de los métodos
# de la clase mas a su derecha en la definición

class Terrestre:

    def desplazar(self):
        print ("El animal anda")


class Acuatico:

    def desplazar(self):
        print ("El animal nada")


class Cocodrilo(Terrestre,Acuatico):
    pass

c = Cocodrilo()
c.desplazar()
 


Fijaros, el cocodrilo además de terrestre es acuático. El problema es que un método sobrescribe al otro.
Tal como dice la descripción:

"Las clases sobrescribirán la implementación de los métodos de la clase mas a su derecha en la definición."
Así que la salida es :

Citar:

El animal anda


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 21 Julio 2015, 00:31; editado 1 vez 
Shell - 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 Propuesta De Crear Un Super Simple Compone... v3ctor General 4 Lunes, 17 Noviembre 2014, 14:44 Ver último mensaje
v3ctor
No hay nuevos mensajes Ejemplo Super Simple De Gb.report2 v3ctor Controles/Librerías/Componentes 8 Viernes, 18 Septiembre 2015, 21:01 Ver último mensaje
v3ctor
No hay nuevos mensajes Super Libreria tercoIDE Controles/Librerías/Componentes 8 Jueves, 15 Diciembre 2016, 13:54 Ver último mensaje
tincho
No hay nuevos mensajes Coordenada De Un Objeto Con Respecto A Su ... Shell General 1 Miercoles, 06 Febrero 2019, 14:44 Ver último mensaje
Shell
 

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