Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

sábado, 18 de agosto de 2012

Ejemplo de Herencia y Polimorfismo (I: Modo Consola)

Vamos a pasar a describir un ejemplo de herencia y polimorfismo en Gambas3.

El objetivo es hacer un programa que calcule el perímetro de rectángulos, cuadrados y circunferencia, usando la programación orientada a objetos.


Podemos crear una clase, la llamaremos classfigura, que englobe a los diversos tipos (rectangulo,cuadrado,circuferencia).


Esta clase figura tendrá un método para calculo del  perimetro (CalculoPerimetro) y otro que he añadido para que nos de información de la figura.


' Gambas class file

Public Function CalculoPerimetro() As Float

End


Public Function define() As String
End

Ahora añadiremos varias clases, que hereden de la clase figura. Esto se hace haciendo click con el botón derecho en el menu del proyecto:
Pulsando en el menu "Nuevo" y luego "Clase"

Ahora eligimos que herede de la clase Figura y le pondremos el nombre de ClassCuadrado

Repetimos los pasos para crear las clases ClassRectangulo y ClassCirculo, todas ellas heredan de la la classFigura.

Ahora, nos vamos a la clase Cuadrado, y redefinimos las funciones (a esto se le llama polimorfismo):

' Gambas class file
Export
Inherits ClassFigura

Private $lado As Float

Public Sub _new(lado As Float) ''constructor: pide las longitudes del lado
$lado = lado
End

Public Function CalculoPerimetro() As Float '' calculo del perimetro
Dim perimetro As Float

perimetro = $lado * 4
Return perimetro
End

Public Function define() As String ''Escribe que figura es
Return "Cuadrado"
End



Ahora la clase Réctangulo: classRectangulo

' Gambas class file
Export
Inherits ClassFigura

Private $ladoA As Float
Private $ladoB As Float

Public Sub _new(ladoA As Float, ladoB As Float) ''constructor: pide las longitudes de los lados A y B

$ladoA = ladoA
$ladoB = ladoB

End

Public Function CalculoPerimetro() As Float '' calculo del perimetro

Dim perimetro As Float

perimetro = $ladoA * 2 + 2 * $ladoB

Return perimetro

End



Public Function define() As String ''Escribe que figura es

Return "Rectangulo"

End

Y ahora la clase Circulo: classCirculo

' Gambas class file
Export
Inherits ClassFigura

Private $radio As Float

Public Sub _new(radio As Float) ''constructor: pide el radio del circulo
$radio = radio
End

Public Function CalculoPerimetro() As Float '' calculo del perimetro
Dim perimetro As Float

perimetro = 2 * $radio * Pi
Return perimetro
End

Public Function define() As String ''Escribe que figura es
Return "Circulo"
End

Por ahora no vemos nada nuevo.. ninguna utilidad...¿no?... ahora verás...
En la clase de inicio, vamos a definir varias instancias y una función "infome":

' Gambas module file

Public Sub Main()

Dim cua As New ClassCuadrado(19)

Dim rect As New ClassRectangulo(10, 5)

Dim cir As New ClassCirculo(8)

Print "Escribimos los perimetros de las figuras creadas anteriormente"
informe(cua)
informe(rect)
informe(cir)

End

Public Function informe(a As ClassFigura) As Float

Print a.define(); " ";
Print a.CalculoPerimetro()

End

Fíjate que la función informe recibe como argumento una clase figura, y en la funcion Main, le estamos mandando diversas clases (pero todas ellas heredan de la clase figura!!!)
Lo que nos va a imprimir, va a hacer el cálculo del perímetro, siendo la forma de calcularmo como lo hayamos definido en la figura que le mandemos...

Resultado en la consola:

Escribimos los perimetros de las figuras creadas anteriormente
Cuadrado 76
Rectangulo 30
Circulo 50,2654824574367

La gran ventaja que tiene este método, es que el día de mañana, que añadamos una nueva figura (por ejemplo una elipse),  la función "informe" no cambiará en nada, siendo capaz de darnos el cálculo del perímetro.

Actividad:
1) Añade la claseElipse, para que nos calcule el perimetro.
2) Añade a las clases anteriores la fórmula de cálculo del área. Y que el programa principal sea capaz de darnos el área de las figuras.


Enlace de descarga del ejemplo: Enlace


2 comentarios:

  1. saludos muy interesante.. quisiera saber si en la herencia en este caso particular, puedo realizar un calculo estandar en la funcion padre que todos los objetos hijos hereden

    me explico ql igual que java y las interfaces, obligar a que todas las clases que hereden a juro implemneten y devuelvan el mismo tipo de dato en vez de permitir sobrescritura

    ResponderEliminar
  2. piccoro... tal vez con un método Static en la clase padre

    ResponderEliminar

A falta de donativos... un poco de publicidad