Está en la página 1de 9

Lenguaje de Programacin II

UCPS

ARRAY
Un array es un conjunto de elementos de cualquier ndole. Como un conjunto, podemos darle la Longitud que queramos, o dejarla sin establecer para poder ir aadiendo valores sin preocuparnos. Para declarar un array, lo nico que hay que hacer es acabar en () la declaracin del objeto que queramos. Por ejemplo: Dim objeto(5) as String Ah hemos declarado un array de 6 elementos del tipo String. 6? S, porque incluye el 0. As, ahora tenemos estos elementos con sus diferentes valores (nulo por defecto). Objeto(0) = "Objeto 1" Objeto(1) = "Objeto 2" Objeto(2) = "Objeto 3" Objeto(3) = "Objeto 4" Objeto(4) = "Objeto 5" Objeto(5) = "Objeto 6" Como podis observar, lo bueno de los arrays es que es un mismo nombre, pero con un argumento entre los parntesis, lo que nos permite recorrerlo fcilmente con un bucle. En caso de que hagis esto, recordad de que deber ser de la siguiente forma: For i = 0 to objeto.Lenght - 1 Next Como el array empieza en el cero, debemos empezar dandole el valor 0 a la variable, y contando con este, si hemos puesto objeto(5), recordamos que la longitud es igual a 6 al contar con el cero. Por tanto, si recorremos de 0 a la longitud del array (escribimos 5, longitud 6), acabariamos en Objeto(6), que no existe. Una vez pasado este punto, es importante decir que un array como el que hemos declarado es de 1 dimensin, es decir, es una lista "unidireccional", podramos decir. Sin embargo, podemos ponerle ms dimensiones, de hecho, hasta 255 dimensiones (si, una burrada). Normalmente, si usamos 2 dimensiones (Objeto(5,5)) lo que representamos es una tabla, 3 dimensiones, el espacio, etc. Para recorrer todos sus componentes, debemos de "superponer" los bucles de cada dimensin, metiendo uno dentro de otro de la siguiente forma: Dim objeto(5,5,7) as String For i = 0 to 5 For a = 0 to 5 For b = 0 to 7 Objeto(i,a,b) = "Fila: " & i & vbcrlf & "Columna: " & a & vbcrlf & "Profundidad: " & b Next Next Next 1

Lenguaje de Programacin II

UCPS

Clases y Metodos o Funciones


La programacin orientada a objetos (POO a partir de ahora) entre la que se incluye nuestro lenguaje en cuestin, VB.NET, se basa en que los problemas (y programas) se plantean como objetos reales de nuestro da a da. Por ejemplo, si vamos a crear un programa para gestionar una entidad bancaria, nosotros crearemos un objeto que ser el banco, que incluir en su interior otros objetos, como sern los clientes, y estos a su vez contendrn otros objetos, que sern las cuentas bancarias. Todo esto, acompaado de unas propiedades, como sera un nombre para el objeto "banco", para indicar el nombre de la entidad, tambin un nombre para los objetos "clientes", para determinarlos y diferenciarlos, y una ID para diferenciar los objetos "cuentas". Por ltimo, cada objeto tendr unos mtodos o funciones, que nos permitirn interactuar con l. Cmo se declara una clase? Class Clases_Tutorial_POO_1 End Class Las clases se declaran mediante la palabra reservada "Class". Dentro, pueden contener propiedades, objetos y mtodos. Las propiedades son variables, que tienen asociados unos procedimientos especiales. Esos procedimientos los veremos mas adelante, mientras tanto, nos conformaremos con poner las variables. Estas deben declararse en modo "Pblic", pues si se declaran con "Dim" ser lo mismo que usar "Private". Cul es la diferencia? Las "Private" solo pueden ser modificadas o usadas dentro de la misma clase, y veremos que muchas veces a nosotros lo que nos interesa es poder usarlas o modificarlas desde fuera. Public propiedad_nombre as string Public propiedad_valor as integer

Pero, cmo declaramos un mtodo?. Debemos elegir entre dos tipos: cuando no queremos devolver un valor, sino solamente hacer algo (por ejemplo, mostrar un mensaje por pantalla), utilizamos la palabra reservada "Sub", poniendo antes otra palabra reservada, que indicar el mbito en el que podemos llamar a dicho mtodo: Public Sub Mensaje(byval msj as string) system.console.write(msj) End Sub Y sin embargo, si queremos devolver un valor, debemos especificar que tipo de valor vamos a devolver, y utilizar la palabra reservada "return" para devolver dicho valor: Public Function Suma(byval n1 as integer, byval n2 as integer) as integer Dim resul as integer = 0 resul = n1 + n2 return resul End Function 2

Lenguaje de Programacin II

UCPS

Como podis observar, al devolver un valor, hemos especificado que tipo de valor queremos en la cabecera de la funcin (as integer), y hemos devuelto el resultado que estaba almacenado en la variable resul con la palabra reservada "return". Cmo podra ser entonces nuestra clase? Pues quedara ni ms ni menos que as: Class Clases_Tutorial_POO_1 Public nombre as string Public valor as integer Public Sub Mensaje(byval msj as string) system.console.write(msj) End Sub Public Function Suma(byval n1 as integer, byval n2 as integer) as integer Dim resul as integer = 0 resul = n1 + n2 return resul End Function End Class

Y ahora que ya sabemos cmo crearla, nos queda saber cmo utilizarla. Como una clase es un "tipo" de objeto, vamos a crear un objeto de ese tipo. Y el objeto tendr unas propiedades y podr hacer unas cosas. Por ejemplo: Dim objeto as Clases_Tutorial_POO_1 = new Clases_Tutorial_POO_1() objeto.nombre = "Objeto nmero 1" objeto.valor = 1 objeto.Mensaje(objeto.nombre & ". Suma de 2+2=" & objeto.Suma(2, 2))

Lenguaje de Programacin II

UCPS

PROPIEDADES
Las propiedades son variables, que tienen asociados unos procedimientos especiales. Para empezar, debemos declarar esas variables: Public propiedad_nombre as string Public propiedad_valor as integer Sin embargo, debido a que nosotros queremos que estas variables sean propiedades, nosotros no debemos dejar que la variable se vea desde fuera, sino que se vea como propiedad nicamente. Por ello, hemos de declararlas con Dim (o Private, ya que Dim presupone Private): Private propiedad_nombre as string Private propiedad_valor as integer Y ahora, toca crear los procedimientos de la propiedad. La declaracin tiene la siguiente estructura: Public Property NombredelaPropiedad() as TipodelaPropiedad End Property Y de esa forma, ha de ser la propiedad que vamos a definir. En nuestro caso, la primera sera: Public Property Nombre() as string End Property Ahora viene el "punto" del asunto, el "OnlyRead" o la propiedad de lectura y escritura. Dentro de nuestra propiedad, podemos hacer solamente 2 bloques, a saber: Get End Get Que como ya imaginas, es la caracterstica de "Lectura", y: Set(byval UnNombreparaVariable as TipodelaPropiedad) End Set Que es la caracterstica de "Escritura" en la propiedad. A la hora de rellenar estos bloques, es fcil reconocer que en el bloque de lectura, solo debemos hacer un return con la variable de la propiedad, en nuestro caso: Get return propiedad_nombre End Get Pero, y en la de escritura? Pues en este bloque, podemos poner controles, para que nuestra propiedad no tome un valor indeseado. Por ejemplo:

Lenguaje de Programacin II Set(byval nombre as string) propiedad_nombre=nombre End Set Y si hemos metido de nombre "", es decir, vaco? Pues podemos controlarlo: Set(byval nombre as string) if nombre = "" then system.console.writeline("Error: Nombre no vlido") else propiedad_nombre=nombre end if End Set

UCPS

Y de esta forma, controlamos los posibles valores indeseados en nuestra propiedad. Un detalle es. Si se desea una propiedad de solo lectura, lo que se ha de hacer es omitir el bloque "Set"; si por el contrario se desea una propiedad de solo entrada ("Write"), entonces lo que se ha de hacer es omitir el bloque "Get".

CONSTRUCTORES
Cuando nosotros creamos una nueva clase, existe el denominado constructor por omisin. El constructor es un mtodo llamado "New", que lo que hace es inicializar los parmetros que tiene la clase. Como habris notado, como lo que hace es inicializar esos parmetros, el constructor se invocar cuando creemos un nuevo objeto de dicha clase. Si recordis del tutorial 1: Dim objeto as Clases_Tutorial_POO_1 = new Clases_Tutorial_POO_1() Nosotros no creamos el mtodo "New", por lo que el que se usa es el constructor por omisin, que no es necesario declararlo. Pero, Por qu es esto necesario? La respuesta est en que las variables hay que inicializarlas (darles un valor de inicio), para que pasen de un estado de "No tener nada" al estado de "Tener el estado por defecto (nulo)" (o un valor concreto si asi lo deseamos). Esto puede llevarnos a provocar excepciones en tiempo de ejecucin, por lo que lo que debemos hacer es inicializar las clases con su constructor. Si nosotros creamos un nuevo mtodo "New" para nuestra clase, el constructor por omisin es destruido, por lo que, si queremos volver a utilizarlo, debemos declararlo tambin: Public Sub New() End Sub Pero, qu hace el constructor por omisin?: Este constructor inicializa todas las variables a sus valores nulos por defecto, quedando as todas las variables inicializadas. 5

Lenguaje de Programacin II

UCPS

Y pensndolo bien, hay una cosa que choca. Si hemos dicho que al crear un nuevo constructor "New", se destruye el constructor por omisin, y hay que volver a declararlo, No habra dos mtodos con el mismo nombre? No es eso imposible?

La respuesta es que s, habra dos mtodos con el mismo nombre, y no, no es imposible. Cuando un mtodo est repetido, se dice que est "Sobrecargado", y existe una condicin para que esto sea posible: Los parmetros de las distintas definiciones de los mtodos, deben ser distintos. Esto es, no se puede hacer: Public Sub New() End Sub Public Sub New() System.console.writeline("Constructor dos") End Sub Porque ambos estn declarados usando los mismos parmetros (ninguno) --> (). Sin embargo, si sera posible:

Public Sub New() system.console.writeline("Constructor por omisin") End Sub Public Sub New(byval mensaje as string) system.console.writeline("Constructor usando un mensaje") End Sub Public Sub New(byval objeto as integer) system.console.writeline("Constructor invocado por el objeto numero " & objeto & " del tipo NuestraClase") End Sub

Podemos fijarnos en que lo importante es, no el valor que devuelven (en este caso ninguno, ya que son mtodos "Sub", en lugar de funciones "Function"), sino el tipo de los parmetros. El compilador de VB.NET compara automticamente el tipo del parmetro que pasamos en la llamada al constructor, y selecciona el mtodo apropiado al que nosotros nos referimos. Por ejemplo, podramos tener, para la clase del tutorial 2, los siguientes constructores:

Public Sub New() 'Constructor por omisin End Sub Public Sub New(byval nombre as string) Propiedad_Nombre = nombre Propiedad_valor = 0 6

Lenguaje de Programacin II End Sub Public Sub New(byval valor as integer) Propiedad_Nombre = "" Propiedad_valor = valor End Sub Public Sub New(byval nombre as string, byval valor as integer) Propiedad_Nombre = nombre Propiedad_valor = valor End Sub

UCPS

HERENCIA
Cuando nosotros creamos una nueva clase, esta ha de tener una superclase o clase base, que es una clase de la que la nuestra deriva. En VB.NET, la superclase es System.Object: todas las clases que nosotros creamos, derivan automaticamente de la clase Object. Pues bien, cuando una clase deriva de otra, se dice que es hija, y por tanto, puede haber herencia si as se desea. La herencia, es que la clase derivada, tenga las mismas propiedades y mtodos que la clase base de la que procede, excepto los constructores. Para hacer esto, se usa la palabra reservada Inherits, seguida del nombre de la clase que queremos que sea la superclase. Por ejemplo, si cogemos nuestro tutorial 3, y creamos una nueva clase con nombre Clases_Tutorial_POO_4, y lo derivamos la de clase Clases_Tutorial_POO_3, sera as: Class Clases_Tutorial_POO_4 Inherits Clases_Tutorial_POO_3 End Class Con esto, la clase Clases_Tutorial_POO_4 sera idntica a la clase Clases_Tutorial_POO_3, puesto que no hemos aadido nada nuevo, solamente hemos hecho que herede sus propiedades y mtodos (salvo los constructores, insisto. En la clase Clases_Tutorial_POO_4, solo tenemos el constructor por omisin). Por tanto, ahora podramos hacer algo tal como esto: Dim miclase as Clases_Tutorial_POO_4 = new Clases_Tutorial_POO_4() miclase.Propiedad_Nombre = "Objeto 1 de tipo Clases_Tutorial_POO_4" Ya que la propiedad "Propiedad_Nombre" est heredada de Clases_Tutorial_POO_3. El problema de los constructores, tiene dos soluciones, y es bastante simple. La primera es hacernos unos nuevos constructores, que bastante tiempo nos hemos ahorrado heredando la clase anterior, como para no gastar 2 minutos en hacer unos constructores nuevos. La segunda, integrable en la primera, es utilizar los constructores de la clase base (Clases_Tutorial_POO_3) para inicializar las propiedades heredadas de dicha clase. Pero, cmo podemos hacer eso, si el constructor no est heredado? 7

Lenguaje de Programacin II

UCPS

Gracias a la palabra reservada MyBase, podemos acceder a miembros ocultos de la clase base. As, en nuestra clase Clases_Tutorial_POO_4, podramos crear este constructor: Public Sub New(byval nombre as string, byval valor as integer) mybase.new(nombre, valor) End Sub

Y as, utilizamos el constructor (4, creo recordar) de la clase Clases_Tutorial_POO_3, para inicializar las propiedades de la clase Clases_Tutorial_POO_4. Podemos repetir el proceso con el resto de constructores si as lo deseamos. Pero lo interesante viene cuando tenemos propiedades nuevas en nuestra clase: Class Clases_Tutorial_POO_4 Inherits Clases_Tutorial_POO_3 Private Precio_Venta As Integer Public Property Precio Get Return Precio_Venta End Get Set(ByVal value) If value > 0 Then Precio_Venta = value End If End Set End Property End Class

Cmo inicializamos ahora nuestra nueva clase, si nuestro constructor solo puede inicializar las propiedades heredadas? Evidentemente, podemos crear un nuevo constructor que lo haga todo, pero en el podemos utilizar el constructor de la clase base, para inicializar las propiedades heredadas: Public Sub New(byval nombre as string, byval valor as integer, byval precioventa as integer) mybase.new(nombre, valor) Propiedad_Venta = precioventa End Sub

Como podis observar, nos ahorramos gran parte del nuevo constructor, invocando al antiguo. Sin embargo, mybase sirve para ms cosas. Supongamos el mtodo "Mensaje" de Clases_Tutorial_POO_3: Public Sub Mensaje(ByVal msj As String) System.Console.WriteLine(msj) End Sub 8

Lenguaje de Programacin II

UCPS

En este mtodo, tenemos que imprimimos un mensaje por consola. Al usar la funcin writeline, no podemos imprimir ms de una lnea, por lo que podramos hacer lo siguiente para imprimir ms de una lnea: Public Overloads Sub Mensaje(ByVal msj As String) If msj.Contains(vbCrLf) Then MsgBox(msj, MsgBoxStyle.OkOnly) Else MyBase.Mensaje(msj) End If End Sub De esta forma, ocultamos la funcin (mtodo) Mensaje de la clase base con la palabra reservada Overloads. Aun as, podramos acceder a l con Mybase. Si nuestro mensaje es de una sola lnea, lo imprimir en consola, mientras que si tiene saltos de lnea, saldr en una ventana emergente.

También podría gustarte