Con el lenguaje Gambas2 (y mucho más Gambas3) podemos hacer tanto programas siguiendo el patrón de programación Estructurada como del tipo Orientados a Objeto.
Este es un ejemplo de como se trabaja (es un ejercicio muy simple) con clases en gambas2.
Este es el ejercicio que hay que realizar:
Desarrollar una clase llamada Punto que:
Tenga dos atributos private de tipo double.
Tenga un constructor con dos parámetros de tipo double que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los dos atributos al valor que se quiera.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
Desarrollar una clase llamada Circulo que:
Tenga dos atributos private de tipo Punto y double.
Tenga un constructor con dos parámetros de tipo Punto y double que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los dos atributos al valor que se quiera.
Tenga un constructor con tres parámetros de tipo double que inicialice los dos atributos.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
Tenga un método calcularArea que no recibe ningún parámetro y devuelve un double.
Tenga un método calcularPerimetro que no recibe ningún parámetro y devuelve un double.
Desarrollar una clase llamada Triangulo que:
Tenga tres atributos private de tipo Punto.
Tenga un constructor con tres parámetros de tipo Punto que inicialice los dos atributos.
Tenga un constructor por defecto (sin parámetros) que inicialice los tres atributos al valor que se quiera.
Tenga un constructor con seis parámetros de tipo double que inicialice los tres atributos.
Tenga un getter para cada uno de los atributos.
Tenga un método calcularDistanciaDesde que recibe un parámetro de tipo Punto y que devuelve un double.
Tenga un método calcularArea que no recibe ningún parámetro y devuelve un double.
Tenga un método calcularPerimetro que no recibe ningún parámetro y devuelve un double.
Desarrollar una clase llamada Practica5a que en su método main: (sustituido por un fmain en gambas)
Cree e inicialice dos objetos de la clase Punto y muestre la distancia entre ambos.
Cree un objeto de la clase Circulo y muestre su área, perímetro y distancia a uno de los dos puntos creados al comienzo.
Cree un objeto de la clase Triangulo y muestre su área, perímetro y distancia a un nuevo punto.
Nota 1: No seremos rigurosos con las matemáticas y supondremos que los triángulos siempre son rectángulos.
Codigo fuente: Clase Punto
' Gambas class file
'atributos
PRIVATE x AS Float = 0
PRIVATE y AS Float = 0
'constructor1
PUBLIC FUNCTION PuntoInicial() AS Punto
x = 2.2
y = 0
END
'constructor2
PUBLIC FUNCTION Punto(param1 AS Float, param2 AS Float) AS punto
x = param1
y = param2
END
'getters
PUBLIC FUNCTION getX() AS Float
RETURN x
END
PUBLIC FUNCTION getY() AS Float
RETURN y
END
PUBLIC FUNCTION calcularDistancia(param AS Punto) AS Float
DIM cateto1 AS Float
DIM cateto2 AS Float
DIM hipotenusa AS Float
cateto1 = x - param.getX()
cateto2 = y - param.getY()
hipotenusa = Sqr(cateto1 ^ 2 + cateto2 ^ 2)
RETURN hipotenusa
END
Clase Circulo
' Gambas class file
' Gambas module file
'atributos
PRIVATE centro AS NEW Punto
PRIVATE radio AS Float = 0
'constructor1
PUBLIC FUNCTION Circulo(param AS Punto, param2 AS Float) AS Circulo
centro = param
radio = param2
END
'conseguir datos
PUBLIC FUNCTION getCentro() AS Punto
RETURN centro
END
PUBLIC FUNCTION getRadio() AS Float
RETURN radio
END
PUBLIC FUNCTION calcularArea() AS Float
RETURN 3.141592 * radio * radio
END
PUBLIC FUNCTION calcularPerimetro() AS Float
RETURN 2 * 3.141592 * radio
END
PUBLIC FUNCTION calcularDistanciaDesde(p AS Punto) AS Float
RETURN centro.calcularDistancia(p)
END
Clase Triangulo
'atributos
PRIVATE p1 AS NEW Punto
PRIVATE p2 AS NEW Punto
PRIVATE p3 AS NEW Punto
'constructor 1
PUBLIC FUNCTION trianguloP(param1 AS Punto, param2 AS Punto, param3 AS Punto) AS Triangulo
p1 = param1
p2 = param2
p3 = param3
END
'constructor2
PUBLIC FUNCTION trianguloXY(x1 AS Float, y1 AS Float, x2 AS Float, y2 AS Float, x3 AS Float, y3 AS Float) AS Triangulo
DIM p AS NEW Punto
p1 = p.Punto(x1, y1)
p2 = p.Punto(x2, y2)
p3 = p.Punto(x3, y3)
END
'getters
PUBLIC FUNCTION getP1() AS Punto
RETURN p1
END
PUBLIC FUNCTION getP2() AS Punto
RETURN p2
END
PUBLIC FUNCTION getP3() AS Punto
RETURN p3
END
PUBLIC FUNCTION calcularArea() AS Float
DIM base AS Float
DIM altura AS Float
base = p1.calcularDistancia(p2)
altura = p1.calcularDistancia(p3)
RETURN base * altura / 2
END
PUBLIC FUNCTION calcularPerimetro() AS Float
DIM lado1 AS Float
DIM lado2 AS Float
DIM lado3 AS Float
lado1 = p1.calcularDistancia(p2)
lado2 = p2.calcularDistancia(p3)
lado3 = p3.calcularDistancia(p1)
RETURN lado1 + lado2 + lado3
END
PUBLIC FUNCTION calcularDistancia(param AS punto) AS Float
RETURN p1.calcularDistancia(param)
END
Clase Main / lo he sustituido por un Fmain para generar la salida grafica
' Gambas class file
PUBLIC SUB _new()
END
PUBLIC SUB Form_Open()
DIM a AS NEW Punto
DIM b AS NEW Punto
DIM distancia AS Float
DIM c AS NEW Circulo
DIM t AS NEW triangulo
DIM punto_aux AS NEW Punto
b.Punto(1.1, 42.3)
a.PuntoInicial()
distancia = a.calcularDistancia(b)
TextArea1.text = "Distancia entre punto A al B es:" & Str$(distancia) & "\n"
c.Circulo(a, 5)
TextArea1.text &= "Circulo:\n"
TextArea1.text &= "Area es: " & Str(c.calcularArea()) & "\n"
TextArea1.text &= "El perimetro es: " & Str(c.calcularPerimetro()) & "\n"
TextArea1.text &= "La distancia entre b y el centro del circulo c: " & Str(b.calcularDistancia(c.getCentro())) & "\n"
punto_aux.Punto(7.3, 1.9)
t.trianguloP(a, b, punto_aux)
TextArea1.text &= "Triangulo:\n"
TextArea1.text &= "El area es:" & Str$(t.calcularArea()) & "\n"
TextArea1.text &= "El perimetro es: " & Str(t.calcularPerimetro()) & "\n"
punto_aux.Punto(8, 9)
TextArea1.text &= "La distancia entre un vertice del triangulo al punto 8.0,9.0: " & Str(t.calcularDistancia(punto_aux)) & "\n"
END
Esta es la salida que genera:
Si comparamos el código de gambas con el java, existen varias diferencias. Por ejemplo gambas no admiten diferentes métodos de constructores con el mismo nombre en una misma clase. Yo los he definido cambiando el nombre. (por ejemplo: trianguloP y trianguloXY ), para admitir los parámetros de puntos o parámetros de coordenadas.
También a lo hora de crear los objetos varia entre los dos lenguajes:
java |
gambas2 |
Punto b = new Punto(1.1,42.3)
Punto a= new Punto() | dim a as New Punto
dim b as New Punto
b.Punto(1.1, 42.3)
a.PuntoInicial() |
Bueno espero que os sea de interés. Saludos
Nota:
-Descarga del código fuente:
http://manualjsb.googlecode.com/files/ejercicio5a-0.0.1.tar.gz
-Este ejercicio inicialmente están hecho en java, tomados de las páginas webs:
http://jmordax.com/practicas.html
http://www.ctr.unican.es/asignaturas/pp/#Practicas
-
Referencia: Libro en preparación de
Fabián Flores Vadell: Cómo programar con Gambas