Herencia, Me, Super..


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

última edición por Shell el Lunes, 20 Julio 2015, 20:11; editado 1 vez

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

Objetivo: Re: Herencia, Me, Super..
Vaya...tengo que cambiar un método..sera después de la cena...

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

última edición por Shell el Lunes, 20 Julio 2015, 20:12; editado 1 vez
Objetivo: 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

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

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

última edición por Shell el Martes, 21 Julio 2015, 00:31; editado 1 vez

Página 1 de 1


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2104s (PHP: 29% SQL: 71%)
Consultas SQL: 27 - Debug off - GZIP Activado