POO Clases
POO Clases
POO Clases
Informacin de los autores: Toms Montero Ripoll Estudiante de 3 de Ingeniera Tcnica Informtica de Sistemas Departamento de Informtica y Automtica Facultad de Ciencias - Universidad de Salamanca Plaza de la Merced S/N 37008 - Salamanca [email protected] Ral del Nogal Snchez Estudiante de 3 de Ingeniera Tcnica Informtica de Sistemas Departamento de Informtica y Automtica Facultad de Ciencias - Universidad de Salamanca Plaza de la Merced S/N 37008 - Salamanca [email protected]
Este documento puede ser libremente distribuido. 2003 Departamento de Informtica y Automtica - Universidad de Salamanca.
Resumen
En este documento se pretende hacer un pequeo acercamiento a la programacin orientada a objetos en Visual Basic .NET, centrndonos en la creacin de clases y jerarqua existente entre ellas. Se har especial hincapi en la sintaxis que este lenguaje utiliza, as como en sus caractersticas propias; basndonos en los conceptos estudiados en la asignatura y que tienen en comn todo los lenguajes de programacin orientados a objetos.
Abstract
In the work, we present an introduction to Object-Oriented Programming in visual Basic .NET. The main topic was can create different classes and its hierarchical analysis. The syntaxes of this language and the main features are studied in this work. We have used the concepts learnt in this subject. All the languages of objects are based on the same concepts.
VB .NET
Tabla de Contenidos
1. 2. 3.
Introduccin ___________________________________________________ 1 mbitos con nombre _____________________________________________ 1 Clases _________________________________________________________ 3 3.1 3.2 3.3 3.4 3.5 3.6 Campos de datos de la clase ___________________________________ 4 Propiedades de la clase _______________________________________ 5 Mtodos de la clase __________________________________________ 7 Eventos de la clase ___________________________________________ 8 Constructores y destructores __________________________________ 9 Clases anidadas ____________________________________________ 10
4.
5.
Referencias ____________________________________________________17
ii
VB .NET
1. INTRODUCCIN
Visual Basic es un descendiente de Basic, que ha existido durante varias dcadas. BASIC (el acrnimo de BeginnersAll-Purpose Symbolic Instruction Code) fue originariamente desarrollado por la Dartmouth University en 1964 como lenguaje para programadores principiantes. BASIC se convirti en el primer lenguaje que la mayora de los programadores aprenda para familiarizarse con los fundamentos de la programacin antes de pasar a lenguajes ms potentes. Visual Basic apareci en mayo de 1991 y supuso una revolucin en la metodologa de desarrollo de aplicaciones, ya que permita la creacin de programas arrastrando y soltando componentes en lugar de tener que codificar manualmente los elementos. Desde muchos puntos de vista Visual Basic .NET supone la madurez de ese proyecto que naci hace mas de diez aos. La nueva versin, Visual Basic .NET, incorpora caractersticas de orientacin a objetos de tal manera que podra considerarse un lenguaje totalmente diferente a sus predecesores y totalmente orientado a objetos, ya que en versiones anteriores Visual Basic era considerado un lenguaje de programacin con sintaxis de objetos, pero no un verdadero lenguaje orientado a objetos. Las principales novedades que incorpora son: - La herencia, tan solicitada por miles de programadores. - Desarrollo de programas con mltiples hilos de ejecucin. - Control estructurado de excepciones. - Inicializadores, que permiten establecer los valores iniciales de las variables.
-1-
Un mbito con nombre, del ingls namespace, es un mbito delimitado explcitamente al que se ha asignado un identificador. En su interior es posible incluir tanto definiciones de tipos como otros mbitos con nombre, creando una anidacin que dar lugar a una jerarqua. Para crear un mbito con nombre, incluyendo en l las definiciones que nos interesen, se utiliza la palabra clave Namespace. Hay que tener en cuenta que todas las definiciones incluidas en su definicin slo existen dentro del espacio con nombres. Por ejemplo:
Namespace Espacio1 Namespace Espacio2 Public Class HolaMundo Public Shared Sub Main() System.Console.WriteLine(Hola Espacio1.Espacio2) End Sub End Class End Namespace End Namespace Namespace Espacio1.Espacio2 Public Class HolaMundo Public Shared Sub Main() System.Console.WriteLine(Hola Espacio1.Espacio2) End Sub End Class End Namespace End Namespace Ejemplo 2.1 En ambos casos tenemos un mbito con nombre, llamado Espacio1, que contiene en su interior otro, denominado Espacio2. Al haberse definido la clase HolaMundo como pblica, es posible crear un objeto de dicha clase desde otro programa, siempre y cuando se componga una referencia completa que permitiese al compilador identificarla de manera unvoca. Esto significara anteponer al nombre de la clase el del mbito o mbitos con nombre donde se encuentra definida, como se hace en este ejemplo: desde desde
VB .NET
Montero y Nogal
Class UsaHolaMundo Shared Sub Main() Dim MiHolaMundo As Espacio1.Espacio2.HolaMundo = New Espacio1.Espacio2.HolaMundo() End Sub End Class Ejemplo 2.2
Una alternativa a esta composicin de referencias cualificadas consiste en utilizar la sentencia Imports, seguida del mbito cuya referencia no deseamos repetir continuamente. El resultado sera, como se puede ver a continuacin, un cdigo ms legible. Imports Espacio1.Espacio2 Class UsaHolaMundo Shared Sub Main() Dim MiHolaMundo As HolaMundo = New HolaMundo() End Sub End Class Ejemplo 2.3
3. CLASES
En la programacin orientada a objetos (POO), utilizamos los objetos para encapsular la informacin asociada a las entidades con las que trabaja el programa. Una clase es un molde que define los atributos y comportamientos de los objetos que se crean como instancias de esta clase. En Visual Basic .NET, la definicin de clase es muy similar a la definicin de la misma en cualquier lenguaje orientado a objetos. Esta versin .NET incluye como novedad que no es necesario crear un mdulo independiente para cada clase. Una clase puede ser base de otra, as como estar derivada de otra. En ella, puede definirse su comportamiento -mtodos- , sus atributos -propiedades-, campos de datos y eventos, e incluso anidar unas clases dentro de otras.
VB .NET
VB .NET
Montero y Nogal
Public class ClaseBase Dim AmbitoDefecto As Integer Private AmbitoPrivado As Integer Protected AmbitoProtegido As Integer Friend AmbitoInterno As Integer Protected Friend AmbitoProtegidoeInterno As Integer Public AmbitoPublico As Integer End class Ejemplo 3.1.1
Desde cualquier mtodo que pertenezca a la clase ClaseBase se puede acceder a todas las variables independientemente de su modificador. Si tuvisemos una clase derivada, la cual heredara todas las variables, no podra acceder a las dos primeras por tener un mbito privado. Si tuvisemos una clase totalmente ajena a ClaseBase, slo podramos acceder a las tres ltimas variables.
VB .NET
Class Ficha Private Pnombre As String Private Pdireccion As String Private Pdepartamento As String Private Pidempleado As Integer //La propiedad Nombre slo puede leerse, al igual que sucede con Direccion Public ReadOnly Property Nombre() As String Get Return Pnombre End Get End Property // La propiedad Departamento puede leerse y escribirse, al igual que sucede con Idempleado. Public Property Departamento() As String Get Return Pdepartamento End Get Set (ByVal Value As String) Pdepartamento = Value End Set End Property End Class Ejemplo 3.2.1
VB .NET
Montero y Nogal
ByVal
Pnombre
As
String,
ByVal
ElseIf Pnombre = Jesus And Pdireccion = Salamanca Then Pidempleado = 2 Departamento = AC Else Throw New Exception (Acceso incorrecto.) End If End Sub Ejemplo 3.3.1
En cuanto a la devolucin de parmetros desde un mtodo, lo nico que hay que hacer es sustituir la palabra Sub, que hemos puesto delante del nombre del mtodo, por Fuction y aadir al final la palabra Al seguida del tipo que corresponda. En el cuerpo del mtodo usaramos la sentencia Return acompaada del valor a devolver.
VB .NET
VB .NET
Montero y Nogal
constructores, siempre que cuenten con diferentes listas de parmetros; mientras que destructor slo puede haber uno por clase. Los constructores tienen por nombre New(), no cuentan con valor de retorno, pueden tomar o no parmetros segn interese, y pueden inicializar las propiedades del objeto instancia o establecer una conexin con una base de datos. El destructor tiene por nombre Finalize(), no cuenta con valor de retorno y no pueden tomar parmetro alguno. Al crear un objeto de una clase, utilizando para ello el operador New, se ejecuta automticamente el constructor que corresponda segn los parmetros facilitados. Sin embargo, el destructor, se ejecuta automticamente para un cierto objeto cuando ya no hay ninguna referencia hacia l, es decir, no necesitamos destruir los objetos explcitamente, de esto se encarga el sistema de recogida de basura de la plataforma .NET. La recogida de objetos no tiles se efecta en momentos concretos en los que no hay ninguna otra actividad pendiente. Class Agenda Public Sub New() End Sub Public Sub New (ByVal Parametro As String) End Sub Protected Sub Finalize() End Sub End Class //Creacin de un objeto sin entregar ningn parmetro Dim MiAgenda As Agenda = New Agenda() //Creacin de un objeto facilitando una cadena Dim Miagenda As Agenda = New Agenda(Parmetro) Ejemplo 3.5.1 //Destructor //y con un parmetro //Constructor sin parmetros
Obsrvese que el destructor es un procedimiento protegido, ya que no es accesible desde el exterior de la clase y se ejecuta automticamente Visual Basic .NET permite el uso de miembros compartidos que no pertenecen a un objeto en particular, sino a toda la clase, por lo que son creados la primera vez que es utilizada la clase
VB .NET
y no cada vez que se crea un objeto. Para ello disponemos del concepto de constructor de clase, el cual no puede tomar parmetros y cuyo nico modificador posible, obligatorio adems, es Shared. Este constructor nicamente se ejecuta cuando se aloja la clase en memoria.
VB .NET
10
Montero y Nogal
Protected Sub Finalize() Console.writeLine(Destructor agenda) Mianotacion = Nothing End Sub End Class //Creamos una que contenga el Main() Class Principal Shared Sub Main() Dim MiAgenda As Agenda = New Agenda() Console.WriteLine(Objeto creado) MiAgenda = Nothing Console.WriteLine(Fin de la aplicacin) End Sub End Class Ejemplo 3.6.1
El resultado que se obtendra por pantalla sera: Constructor de Agenda Constructor de la Clase Anotacin Constructor de Nueva Anotacin Objeto creado Fin de la aplicacin Destructor de Anotacin
4. JERARQUA DE CLASES
La herencia es una de las funciones ms potentes y fundamentales de cualquier lenguaje de programacin orientado a objetos, ya que es posible crear una clase base que encapsule las propiedades y mtodos que sern necesarios en mltiples clases derivadas del mismo tipo. Otra de estas caractersticas fundamentales es el polimorfismo, gracias al cual se pueden definir en una clase base mtodos que sern implementados por las clases que se deriven de ella.
11
VB .NET
4.1. HERENCIA
Gracias a la herencia podemos crear clases base en las que se encapsulen las funciones ms comunes. Posteriormente, podemos crear otras clases que se deriven de las clases base. Las clases derivadas heredan las propiedades y mtodos de las clases base y pueden ampliar o complementar sus funciones para adaptarse a los requerimientos del programa. Para crear una clase derivada en Visual Basic .NET se incluye en su definicin el comando Inherits junto con el nombre de la clase base. Por ejemplo:
Public Class Cuenta Public PnumeroCuenta As Long Public Property NumeroCuenta() As Long Get Return PnumeroCuenta End Get Set (ByVal Value As Long) PnumeroCuenta = Value End Set End Property Public Function HacerBalance () As Double //Cdigo para obtener el balance de la cuenta de la base de datos. End Function End Class Public Class CuentaCorriente Inherits Cuenta Private MinBalance As Double Public Sub Retirar (ByVal Cantidad As Double) //Cdigo para retirar dinero de la cuenta. End Sub End Class Dim Ahorros As CuentaCorriente = New CuentaCorriente () Ahorros.NumeroCuenta = 2000
VB .NET
12
Montero y Nogal
//Mtodo definido por la clase Cuenta heredado //Por la clase CuentaCorriente. //Mtodo definido por la clase CuentaCorriente.
Ejemplo 4.1.1
En ciertas ocasiones, interesa que no se tenga autorizacin para crear instancias de una clase base, forzando que el acceso a los mtodos y propiedades de la clase se realice a travs de una clase derivada. En este caso, construiramos la clase base utilizando el modificador MustInherit. En el siguiente cdigo se muestra la definicin de la clase Cuenta con el modificador MustInherit: Public MustInherit Class Cuenta
Esta definicin convierte a Cuenta en una clase abstracta, ya que define las interfaces de los mtodos y propiedades que sern heredadas por las clases derivadas. As, para poder acceder al mtodo HacerBalance ser necesario crear una instancia de la clase derivada CuentaCorriente.
Por defecto, todas las clases pueden tener herencia. Si no se tiene cuidado, es posible que generemos cadenas de herencia muy complicadas que resultan difciles de administrar y depurar. Utilizando el modificador NotInheritable, es posible crear clases con la total certeza de que no darn lugar a clases derivadas. Este tipo de clases suele denominarse clase sellada o final. Ejemplo: Public NotInheritable Class CuentaCorriente
4.2. POLIMORFISMO
El polimorfismo es la habilidad que tienen objetos basados en diferentes clases para responder a la misma llamada de mtodo utilizando sus propias implementaciones. Los mtodos heredados por las clases derivadas pueden someterse a sobrecarga, para ello utilizamos la palabra clave OverLoads. La signatura de mtodo de la clase sobrecargada debe utilizar el mismo nombre que el mtodo sobrecargado, pero la lista de parmetros debe ser diferente. Es exactamente lo
13
VB .NET
mismo que sobrecargar mtodos de la misma clase, excepto la palabra clave Overloads es opcional y, normalmente, se omite.
Public Class Cuenta Public Sub Retirar (ByVal Cantidad As Double) //Cdigo de implementacin End Sub End Class Public Class CuentaCorriente Inherits Cuenta Public Overloads Sub Retirar (ByVal Cantidad As Double, ByVal MinnumBalance As Double) //Cdigo de implementacin End Sub End Class Ejemplo 4.2.1
En el siguiente ejemplo, se realizar una iteracin a travs de la coleccin de clases de tipo cuenta, y el compilador determinar en tiempo de ejecucin qu implementacin concreta de tipo cuenta debe ejecutar. De este modo, no hay que preocuparse de a qu tipo de clase estamos haciendo referencia, pues los tipos de clase implementan las mismas interfaces de mtodo. As, nos interesa que todas las clases de cuentas contengan un mtodo ObtenerInfoCuenta con la misma definicin de interfaz, pero con diferentes implementaciones que dependern del tipo de cuenta. Para poder reemplazar un mtodo heredado en la clase derivada, usamos la palabra clave Overrides en la definicin del mismo.
Public MustInherit Class Cuenta Public MustOverride Function ObtenerInfoCuenta () As String End Class
VB .NET
14
Montero y Nogal
Public Class CuentaCorriente Inherits Cuenta Public Overrides Function ObtenerInfoCuenta () As String Return Imprimiendo informacin de cuenta corriente End Function End Class Public Class CuentaAhorro Inherits Cuenta Public Overrides Function ObtenerInfoCuenta () As String Return Imprimiendo informacin de cuenta de ahorros End Function End Class Ejemplo 4.2.2 Tambin se puede obtener un resultado similar utilizando una interfaz, que definir las firmas de los mtodos. En lugar de heredar de una clase base Cuenta, definiremos una interfaz ICuenta, y las clases que la implementen deben aportar el cdigo de implementacin de todos los mtodos definidos por ella:
Public Interface ICuenta Function ObtenerInfoCuenta () As String End Interface Public Class CuentaCorriente Implements ICuenta Public Function ObtenerInfoCuenta () As String Implements ICuenta.ObtenerInfoCuenta Return Imprimiendo informacin de cuenta corriente End Function End Class Public Class CuentaAhorro Implements ICuenta Public Function ObtenerInfoCuenta () As String Implements ICuenta.ObtenerInfoCuenta Return Imprimiendo informacin de cuenta de ahorros End Function End Class
15
VB .NET
Ejemplo 4.2.3
5. CONCLUSIONES
Al igual que sus predecesores, Visual Basic .NET sigue siendo un lenguaje potente y fcil de aprender. Las clases pueden definir en su interior campos de datos, propiedades, mtodos, eventos e incluso permite en anidamiento entre clases. Con la introduccin de la herencia en Visual Basic .NET, se puede considerar esta versin totalmente orientada a objetos. Permite tanto sobrecarga (redefinicin) de mtodos heredados, como reemplazo del cuerpo de dichos mtodos.
6. REFERENCIAS
Francisco Charte Ojeda. Microsoft Visual Basic .NET Ediciones Anaya Multimedia (Grupo Anaya, S.A.). 2001. Dan Clark. Introduccin a la Programacin Orientada a Objetos con Visual Basic .NET Ediciones Anaya Multimedia (Grupo Anaya, S.A.). 2003. Luis Miguel Blanco. Programacin en Visual Basic .NET Editorial Eidos. 2002. Web Site. http://guille.costasol.net/NET/cursoVB.NET
VB .NET
16