• No results found

The build up to applications for overdrafts and loans 111155

Como hemos ido viendo todo en .Net gira entorno a las clases, a los objetos. Un formulario es una clase, un botón también, etc. Vamos a intentar crear una clase.

Comenzamos creando un proyecto nuevo como en ejercicios anteriores. A este le daremos el nombre “Puntosyclases”.

7.1 Clase Punto2D.

Para crear una clase en el proyecto actual, vamos al menú Proyecto/Agregar clase y elegimos como nombre Punto2d.vb en la pantalla que aparece que tendrá el aspecto:

Vamos a crear las siguientes funciones en la clase Punto2d:

Public Class Punto2d

Public x, y As Double 'Variables de la clase Punto2d son públicas, permitirán acceder a ellas.

'Se podrían haber creado como propiedades

Sub mostrar() 'Procedimiento mostrar que visualiza en un mensaje los valores de las coordenadas

MessageBox.Show("La X del punto es " & x & " y la Y del punto es" & y, "Información del Punto")

End Sub

Sub New() 'Constructor por Defecto. Inicializa las Variables y

muestra un mensaje cuando es invocado

x = 0 y = 0

MessageBox.Show("Punto creado con el constructor por defecto", "Constructor por Defecto")

Los constructores “New” son procedimientos especiales que son invocados en el momento de crear un nuevo objeto de tipo nuestra clase. Si nosotros no definimos el constructor el programa se encarga de llamar a uno genérico. En el ejemplo hemos creado tres constructores los tres tienen el mismo nombre con lo que estarían sobrecargados. En el momento de llamar a alguno de ellos, dependiendo de los argumentos que le indiquemos sabe cuál tiene que ejecutar.

El primero es el constructor por defecto. No recibe ningún argumento. El segundo es el constructor con parámetros, recibe como argumento los valores de las coordenadas, se encarga de asignar los valores recibidos a las variables. El tercero es el constructor de copia, recibe una variable del mismo tipo que la clase que estamos definiendo, se encarga de ir copiando cada valor de la clase que recibe en las variables de la clase que declaramos.

También tenemos un procedimiento mostrar para visualizar los valores, y un función para calcular la distancia al punto que nos proporcionan como parámetro.

En los parámetros que recibimos vemos que aparece ByVal, esto significa que los parámetros se reciben por valor. Es decir se recibe una copia de objeto que nos pasen y el original no se verá afectado por las modificaciones que se realicen en el procedimiento. Si pusiésemos ByRef, le estaríamos pasando por referencia. Es decir, pasamos la dirección de memoria del objeto original y éste podría verse modificado. Crearemos ahora un aplicación para ilustrar cómo utilizamos la clase creada. Cambiamos el nombre al formulario Form1.vb y le llamamos “frm_principal.vb”. El aspecto que debería presentar el formulario sería:

Sub New(ByVal coord_x As Double, ByVal coord_y As Double) 'Constructor de parámetros

x = coord_x y = coord_y

MessageBox.Show("Punto creado con el constructor de parametros", "Constructor de Parámetros")

End Sub

Sub New(ByVal p2 As Punto2d) 'Constructor de copia

x = p2.x y = p2.y

MessageBox.Show("Punto creado con el constructor de copia",

"Constructor de Copia") End Sub

Function distanciaA(ByVal p2 As Punto2d) As Double

'Función distancia. Calcula la distancia al

'punto que nos pasan como argumento

Dim distanciax, distanciay As Double distanciax = p2.x - x

distanciay = p2.y - y

distanciaA = Math.Sqrt(distanciax * distanciax + distanciay * distanciay)

'Calculamos la distancia y se la asignamos al nombre de la función. Así devolvemos el valor

End Function End Class

Al botón de Salir le ponemos el código de cerrar el formulario usado en otras ocasiones. Al botón de crear puntos le asociamos lo siguiente:

Podemos probar el funcionamiento de este breve programa.

7.2 Clase Punto3D. Herencia

Creamos una clase nueva llamada Punto3d, siguiendo los pasos indicados para la clase Punto2d. Una vez creada le realizamos las modificaciones que se observan en el código siguiente:

Public Class frm_principal

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim dista As Double

Dim p As New Punto2d 'Creamos punto con el constructor por defecto

p.x = 5 'Asignamos un valor a la variable x del punto p

p.y = 8 'Asignamos un valor a la variable y del punto p

p.mostrar() 'llamamos al método mostrar de la clase punto2d

Dim p2 As New Punto2d(3, 7) 'Creamos otro punto p2 con el constructor por argumentos

p2.mostrar() 'Mostramos el punto p2

Dim p3 As New Punto2d(p2) 'Creamos el punto p3 con el constructor de copia a partir del punto p2

p3.mostrar() 'Mostramos p3 que tendrá los mismos valores que p2

dista = p3.distanciaA(p) 'Calculamos la distancia del punto p3 al p

MessageBox.Show("La distancia es " & Format(dista,

"0.0000"), "DISTANCIA ENTRE PUNTOS")

'Mostramos la distancia calculada. Con format podemos indicar los decimales que queremos y en general

'el formato con el que queremos que nos muestre el valor de una variable.

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.Close() End Sub

Con Inherits Punto2d le indicamos que herede de la clase anterior. Vamos a sobrescribir el procedimiento mostrar para que muestre los datos de 2 y 3 dimensiones. Se lo indicamos con Overrides Sub mostrar(). Para que me permita sobrescribir el procedimiento mostrar en la clase Punto3d le tengo que indicar en la clase Punto2d que el procedimiento es “sobreescribible”. Se lo indicamos con Overridable Sub

mostrar(). Con Mybase podemos llamar a los métodos de la clase base (Punto2d). Así nos ahorramos repetir código.

Modificamos el formulario añadiendo otro botón.

Public Class Punto3d

Inherits Punto2d 'Así le indicamos que la clase Punto3d hereda sus propiedades de Punto2D

Public z As Double ' El punto3D tendrá también Z

Overrides Sub mostrar() ' Declaramos el procedimiento mostrar y le indicamos que sobreescriba

'el mostrar de la clase base.

MyBase.mostrar() 'Llamo al mostrar de punto2d para que muestre la X y la Y

MessageBox.Show("Y la Z del punto es " & z, "Información del Punto") 'Muestro la Z

End Sub

Sub New() 'Constructor por Defecto. Inicializa las Variables y

muestra un mensaje cuando es invocado

MyBase.New() 'llamo al constructor por defecto de punto2d

z = 0

MessageBox.Show("Punto 3D creado con el constructor por defecto", "Constructor por Defecto")

End Sub

Sub New(ByVal coord_x As Double, ByVal coord_y As Double, ByVal coord_z As Double) 'Constructor de parámetros

MyBase.New(coord_x, coord_y) 'Llamo al constructor con argumentos y le paso la x e y recibidas

z = coord_z 'Asigno a la Z el valor recibido

MessageBox.Show("Punto 3D creado con el constructor de parametros", "Constructor de Parámetros")

End Sub

Sub New(ByVal otrop3d As Punto3d) 'Constructor de copia

MyBase.New(otrop3d) 'Llamo al constructor de copia pasando el punto recibido. Observar que le paso un

'objeto de tipo punto 3d. Pero un punto3d también es Punto2d al ser derivada de ella.

z = otrop3d.z 'Asigno la Z

MessageBox.Show("Punto 3D creado con el constructor de copia", "Constructor de Copia")

End Sub End Class

Y le asignamos al botón el código que se indica a continuación para que nos ilustre el funcionamiento.

Ejecutamos el programa, guardamos y cerramos el proyecto.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim unpunto3d As New Punto3d

unpunto3d.x = 5 'Asignamos un valor a la variable x del punto p

unpunto3d.y = 8 'Asignamos un valor a la variable y del punto p

unpunto3d.z = 9 'Asignamos un valor a la variable y del punto p

unpunto3d.mostrar() 'llamamos al método mostrar de la clase punto2d

Dim p2 As New Punto3d(3, 7, 12) 'Creamos otro punto p2 con el constructor por argumentos

p2.mostrar() 'Mostramos el punto p2

Dim p3 As New Punto3d(p2) 'Creamos el punto p3 con el constructor de copia a partir del punto p2

p3.mostrar() 'Mostramos p3 que tendrá los mismos valores que p2