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
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
ResponderEliminarme 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
piccoro... tal vez con un método Static en la clase padre
ResponderEliminar