Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Objetos
Un objeto es una agrupacin de cdigo, compuesta de propiedades y mtodos,
que pueden ser manipulados como una entidad independiente. Las
propiedades definen los datos o informacin del objeto, permitiendo consultar o
modificar su estado; mientras que los mtodos son las rutinas que definen su
comportamiento.
Un objeto es una pieza que se ocupa de desempear un trabajo concreto
dentro de una estructura organizativa de nivel superior, formada por mltiples
objetos, cada uno de los cuales ejerce la tarea particular para la que ha sido
diseado.
Clases
Una clase no es otra cosa que el conjunto de especificaciones o normas que
definen cmo va a ser creado un objeto de un tipo determinado; algo parecido
a un manual de instrucciones conteniendo las indicaciones para crear el objeto.
Los trminos objeto y clase son utilizados en OOP con gran profusin y en
contextos muy similares, por lo que para intentar aclarar en lo posible ambos
conceptos, diremos que una clase constituye la representacin abstracta de
algo, mientras que un objeto constituye la representacin concreta de lo que
una clase define. La clase determina el conjunto de puntos clave que ha de
cumplir un objeto para ser considerado perteneciente a dicha clase o categora,
ya que no es obligatorio que dos objetos creados a partir de la misma clase
sean exactamente iguales, basta con que cumplan las especificaciones clave
de la clase.
Expongamos ahora las anteriores definiciones mediante un ejemplo preciso: un
molde para crear figuras de cermica y las figuras obtenidas a partir del molde.
En este caso, el molde representara la clase Figura, y cada una de las figuras
creadas a partir del molde, sera un objeto Figura. Cada objeto Figura tendr
una serie de propiedades comunes: tamao y peso iguales; y otras
propiedades particulares: un color distinto para cada figura.
Aunque objetos distintos de una misma clase pueden tener ciertas propiedades
diferentes, deben tener el mismo comportamiento o mtodos. Para explicar
mejor esta circunstancia, tomemos el ejemplo de la clase Coche; podemos
crear dos coches con diferentes caractersticas (color, tamao, potencia, etc.),
pero cuando aplicamos sobre ellos los mtodos Arrancar, Acelerar o Frenar,
ambos se comportan o responden de la misma manera.
Abstraccin
La abstraccin es aquella caracterstica que nos permite identificar un objeto a
travs de sus aspectos conceptuales.
Las propiedades de los objetos de una misma clase, pueden hacerlos tan
distintos que sea difcil reconocer que pertenecen a una clase idntica. No
obstante, nosotros reconocemos a qu clase pertenecen, identificando
adems, si se trata de la misma clase para ambos. Ello es posible gracias a la
abstraccin.
Tomemos como ejemplo dos objetos coche, uno deportivo y otro familiar; su
aspecto exterior es muy diferente, sin embargo, cuando pensamos en
cualquiera de ellos, sabemos que ambos pertenecen a la clase Coche, porque
realizamos una abstraccin o identificacin mental de los elementos comunes
que ambos tienen (ruedas, volante, motor, puertas, etc.).
Del mismo modo que hacemos al identificar objetos reales, la abstraccin nos
ayuda a la hora de desarrollar una aplicacin, permitindonos identificar los
objetos que van a formar parte de nuestro programa, sin necesidad de disponer
an de su implementacin; nos basta con reconocer los aspectos conceptuales
que cada objeto debe resolver.
Por ejemplo, cuando abordamos el desarrollo de un programa de gestin
orientado a objetos, realizamos una abstraccin de los objetos que
necesitaramos para resolver los procesos del programa: un objeto Empleado,
para gestionar al personal de la empresa; un objeto Factura, para gestionar las
ventas realizadas de productos; un objeto Usuario, para verificar las personas
que utilizan la aplicacin, etc.
Encapsulacin
La encapsulacin establece la separacin entre el interfaz del objeto y su
implementacin, aportndonos dos ventajas fundamentales.
Por una parte proporciona seguridad al cdigo de la clase, evitando accesos y
modificaciones no deseadas; una clase bien encapsulada no debe permitir la
modificacin directa de una variable, ni ejecutar mtodos que sean de uso
interno para la clase.
Por otro lado la encapsulacin simplifica la utilizacin de los objetos, ya que un
programador que use un objeto, si este est bien diseado y su cdigo
correctamente escrito, no necesitar conocer los detalles de su
implementacin, se limitar a utilizarlo.
Tomando un ejemplo real, cuando nosotros utilizamos un objeto Coche, al
presionar el acelerador, no necesitamos conocer la mecnica interna que hace
moverse al coche, sabemos que el mtodo Acelerar del coche es lo que
tenemos que utilizar para desplazarnos, y simplemente lo usamos.
Pasando a un ejemplo en programacin, si estamos creando un programa de
gestin y nos proporcionan un objeto Cliente que tiene el mtodo Alta, y sirve
para aadir nuevos clientes a la base de datos, no precisamos conocer el
cdigo que contiene dicho mtodo, simplemente lo ejecutamos y damos de alta
a los clientes en nuestra aplicacin.
Polimorfismo
El polimorfismo determina que el mismo nombre de mtodo, realizar
diferentes acciones segn el objeto sobre el que sea aplicado. Al igual que
suceda en la encapsulacin, el programador que haga uso del objeto, no
necesita conocer los detalles de implementacin de los mtodos, se limita a
utilizarlos.
Pasando a un ejemplo real, tomamos dos objetos: Pelota y VasoCristal; si
ejecutamos sobre ambos el mtodo Tirar, el resultado en ambos casos ser
muy diferente; mientras que el objeto Pelota rebotar al llegar al suelo, el objeto
VasoCristal se romper.
En un ejemplo aplicado a la programacin, supongamos que disponemos de
los objetos Ventana y Fichero; si ejecutamos sobre ambos el mtodo Abrir, el
resultado en Ventana ser la visualizacin de una ventana en el monitor del
usuario; mientras que en el objeto Fichero, se tomar un fichero en el equipo
del usuario y se dejar listo para realizar sobre l operaciones de lectura o
escritura.
Herencia
Se trata de la caracterstica ms importante de la OOP, y establece que
partiendo de una clase a la que denominamos clase base, padre o superclase,
creamos una nueva clase denominada clase derivada, hija, o subclase. En esta
clase derivada dispondremos de todo el cdigo de la clase base, ms el nuevo
cdigo propio de la clase hija, que escribamos para extender sus
funcionalidades.
A su vez podemos tomar una clase derivada, creando una nueva subclase a
partir de ella, y as sucesivamente, componiendo lo que se denomina una
jerarqua de clases, que explicaremos seguidamente.
Existen dos tipos de herencia: simple y mltiple. La herencia simple es aquella
en la que creamos una clase derivada a partir de una sola clase base, mientras
que la herencia mltiple nos permite crear una clase derivada a partir de varias
clases base. El entorno de .NET Framework slo permite utilizar herencia
simple.
Como ejemplo real de herencia, podemos usar la clase Coche como clase
base; en ella reconocemos una serie de propiedades como Motor, Ruedas,
Volante, etc., y unos mtodos como Arrancar, Acelerar, Frenar, etc. Como
clase derivada creamos CocheDeportivo, en la cul, adems de todas las
caractersticas mencionadas para la clase Coche, encontramos propiedades y
comportamiento especficos como ABS, Turbo, etc.
Un ejemplo basado en programacin consistira en disponer de la ya conocida
clase Empleado. Esta clase se ocupa, como ya sabemos, de las operaciones
de alta de empleados, pago de nminas, etc.; pero en un momento dado, surge
la necesidad de realizar pagos a empleados que no trabajan en la central de la
empresa, ya que se trata de comerciales que pasan la mayor parte del tiempo
desplazndose. Para realizar dichos pagos usaremos Internet, necesitando el
nmero de tarjeta de crdito y la direccin email del empleado. Resolveremos
esta situacin creando la clase derivada CiberEmpleado, que hereda de la
clase Empleado, en la que slo tendramos que aadir las nuevas propiedades
y mtodos para las transacciones electrnicas, puesto que las operaciones
tradicionales ya las tendramos disponibles por el mero hecho de haber
heredado de Empleado.
Jerarquas de clases
Como decamos en un apartado anterior, uno de los fines de la OOP consiste
en la clasificacin del cdigo; para ello se emplean jerarquas o rboles de
clases, en los que a base de niveles, se muestra un conjunto de clases
conectadas por una relacin de herencia. Observemos el esquema de la Figura
192, en el que se muestra un ejemplo de la jerarqua de clases de medios de
transporte.
Figura 192. Jerarqua de clases de medios de transporte.
En esta representacin de ejemplo, como nivel superior de la jerarqua o clase
base estara Medios de transporte, de la que se derivaran las clases Barco,
Tren, Automvil, y a su vez, de estas ltimas, partiran nuevas clases hijas.
Herencia
Como acabamos de describir en el apartado sobre caractersticas de la OOP,
cuando a partir de una clase existente, creamos una nueva clase derivada, esta
nueva clase dispone de todas las propiedades y mtodos de la clase base, mas
el cdigo propio que implemente.
Para reconocer si existe esta relacin entre dos objetos, debemos realizar un
anlisis sintctico sobre la misma usando la partcula es un. Tomando como
ejemplo los objetos Empleado, CiberEmpleado y Factura, podemos decir que s
hay una relacin de herencia entre Empleado y CiberEmpleado, ya que al
analizar la frase Un objeto CiberEmpleado es un Empleado, el resultado es
verdadero.
No ocurre lo mismo entre los objetos CiberEmpleado y Factura, ya que el
anlisis de la frase Un objeto CiberEmpleado es una Factura, devuelve falso.
Pertenencia
Los objetos pueden estar formados a su vez por otros objetos. Un objeto
Factura puede estar compuesto por objetos CabeceraFactura, LineaFactura,
etc. Se dice en este caso que hay una relacin de pertenencia, puesto que
existe un conjunto de objetos que pertenecen a otro objeto o se unen para
formar otro objeto. A este tipo de relacin se le denomina tambin
Contenedora.
Para reconocer si existe esta relacin entre dos objetos, debemos realizar un
anlisis sintctico sobre la misma usando la partcula tiene un. As, por
ejemplo, la frase Un objeto Factura tiene un objeto LineaFactura devolvera
verdadero.
Utilizacin
Hay situaciones en que un objeto utiliza a otro para realizar una determinada
tarea, sin que ello suponga la existencia de una relacin de pertenencia entre
dichos objetos.
Por ejemplo, un objeto Ventana puede utilizar un objeto Empleado para mostrar
al usuario las propiedades del empleado, sin necesidad de que el objeto
Empleado sea propiedad del objeto Ventana.
Ntese la importante diferencia entre esta relacin y la anterior, ya que aqu, el
objeto Ventana a travs de cdigo, crear, o le ser pasado como parmetro,
un objeto Empleado, para poder mostrarlo en el rea de la ventana.
Para reconocer si existe esta relacin entre dos objetos, debemos realizar un
anlisis sintctico sobre la misma empleando la partcula usa un. As, por
ejemplo, la frase Un objeto Ventana usa un objeto Empleado devolvera
verdadero.
Reutilizacin
Un objeto bien diseado, puede ser reutilizado en otra aplicacin de modo
directo o creando una clase derivada a partir de l. Este es uno de los objetivos
perseguidos por la OOP, aprovechar en lo posible el cdigo ya escrito,
ahorrando un considerable tiempo en el desarrollo de programas.
Creacin de clases
Volvamos al ejemplo expuesto al comienzo de este tema, en el cul, habamos
dejado a nuestro programador desarrollando los procesos de un empleado
dentro de una aplicacin de gestin empresarial. Recordemos que se
planteaba el problema de que ante el crecimiento del programa, el
mantenimiento del cdigo, al enfocarse de modo procedural, poda volverse
una tarea realmente difcil.
Vamos a replantear este diseo, encauzndolo bajo una perspectiva orientada
a objeto, que nos permita un uso ms sencillo del cdigo y un mantenimiento
tambin ms fcil. Para lo cual desarrollaremos una clase que contenga todas
las operaciones a realizar por el empleado; en definitiva, crearemos la clase
Empleado, cuyo proceso describiremos a continuacin.
Podemos escribir una clase en VB.NET utilizando diferentes tipos de
aplicacin, en este caso emplearemos una aplicacin de consola. Iniciaremos
en primer lugar VS.NET, creando un proyecto de tipo consola. A continuacin
seleccionaremos el men Proyecto + Agregar clase, que nos mostrar la
ventana para agregar nuevos elementos al proyecto. El nombre por defecto
asignado por el IDE para la clase ser Class1; cambiaremos dicho nombre por
Empleado, y pulsaremos Abrir. Ver Figura 193. Figura 193. Aadir una clase a
un proyecto.
Se crear de esta forma un nuevo fichero de cdigo (EMPLEADO.VB),
mostrndose el editor de cdigo con su contenido. Observemos en este
sentido, que la definicin de una clase se realiza utilizando las palabras clave
Class...End Class; entre estas palabras escribiremos el cdigo de la clase. Ver
Cdigo fuente 202.
Public Class Empleado
End Class
Instanciacin de objetos
En este momento, nuestra clase Empleado cuenta con el cdigo mnimo para
poder ser utilizada, para lo que debemos instanciar objetos a partir de la
misma.
Como ya se explic en un apartado anterior, el proceso de instanciacin
consiste en crear un objeto a partir de las especificaciones de la clase. El modo
ms comn de trabajar con una instancia de una clase, o lo que es lo mismo,
con un objeto, pasa por asignar dicho objeto a una variable. Instanciaremos un
objeto en el cdigo utilizando la sintaxis de declaracin de variables junto a la
palabra clave New, empleando como tipo de dato el nombre de la clase. Todo
este cdigo lo podemos situar en un mdulo dentro del proyecto, bien en un
fichero de cdigo aparte o en el mismo fichero en donde estamos escribiendo
la clase. El Cdigo fuente 204 muestra las formas disponibles de instanciar un
objeto y asignarlo a una variable.
Si bien es cierto que ya es posible crear objetos a partir de nuestra clase, no lo
es menos el hecho de que no podemos hacer grandes cosas con ellos, puesto
que la clase se encuentra vaca de cdigo. Debemos aadir propiedades y
mtodos para conseguir que los objetos acten en nuestra aplicacin.
Miembros de la clase
Los elementos de una clase que contienen sus datos y definen su
comportamiento, es decir, las propiedades y mtodos, reciben adems el
nombre de miembros de la clase, trmino que tambin utilizaremos a partir de
ahora.
Dado que los procedimientos Property no son otra cosa que rutinas de cdigo,
tambin se les denomina mtodos de acceso y asignacin en el argot OOP.
Ventajas en el uso de propiedades
Comprobada la facilidad de los campos de clase, el lector se estar
preguntando en estos momentos por qu debe utilizar propiedades, si en
definitiva, su finalidad es la misma que los campos: guardar un valor en el
objeto.
Existen varias y poderosas razones, por las cuales nos debemos decantar en
muchas ocasiones, hacia el uso de propiedades. En los siguientes apartados
haremos una descripcin de ellas.
Module General
Sub Main()
Dim loEmpleado As Empleado
loEmpleado = New Empleado()
loEmpleado.psNombre = "Pedro"
' a esta propiedad slo podemos asignarle valor, si intentamos obtenerlo, se
producir un error
loEmpleado.CuentaBancaria = "2222-56-7779995555"
' en esta lnea, la propiedad EntidadBancaria slo nos permite obtener valor, si
intentamos asignarlo se producir un error
Console.WriteLine("La entidad del empleado {0} es {1}", _
loEmpleado.psNombre, loEmpleado.EntidadBancaria)
Console.ReadLine()
End Sub
End Module
Public Class Empleado ' campo de clase
Public psNombre As String
' variables de propiedad
Private msCtaBancaria As String
Private msEntidad As String
' variables diversas
Private msCodigoEntidad As String
' esta propiedad slo permite asignar valores, por lo que no dispone de bloque Get
Public WriteOnly Property CuentaBancaria() As String
Set(ByVal Value As String)
Select Case Left(Value, 4)
Case "1111" msEntidad = "Banco Universal"
Case "2222" msEntidad = "Banco General"
Case "3333" msEntidad = "Caja Metropolitana"
Case Else msEntidad = "entidad sin catalogar"
End Select
End Set
End Property
' esta propiedad slo permite obtener valores, por lo que no dispone de bloque Set
Public ReadOnly Property EntidadBancaria() As String
Get
Return msEntidad
End Get
End Property
End Class
Cdigo fuente 211
Propiedades virtuales
Otra de las ventajas del uso de propiedades reside en la posibilidad de definir
propiedades virtuales; es decir, una propiedad que no tenga una
correspondencia directa con una variable de propiedad, ya que podemos crear
un procedimiento Property que no est obligatoriamente asociado con una
variable.
Siguiendo con la clase Empleado, en esta ocasin creamos una propiedad para
almacenar la fecha en la que el empleado ha sido incorporado a la empresa;
esto no entraa ninguna novedad. Sin embargo, seguidamente necesitamos
disponer de una propiedad que nos permita mostrar el nombre del mes en el
que se ha dado de alta al empleado.
Podemos resolver esta cuestin creando una variable de propiedad, guardando
en ella una cadena con el nombre del mes; pero si disponemos de la fecha de
alta, que ya contiene el mes, nos ahorraremos ese trabajo extra creando una
propiedad, en este caso de slo lectura, en la que extraigamos el nombre del
mes de la fecha de alta y lo devolvamos como resultado. Veamos como hacerlo
en el Cdigo fuente 212.
Module General
Sub Main()
Dim loEmpleado As Empleado
loEmpleado = New Empleado()
loEmpleado.psNombre = "Antonio"
loEmpleado.FechaAlta = "12/6/2002"
' mostramos el mes de alta, que corresponde a una propiedad virtual del objeto
Console.WriteLine("El empleado {0} se ha dado de alta en el mes de {1}", _
loEmpleado.psNombre, loEmpleado.MesAlta)
Console.ReadLine()
End Sub
End Module
Public Class Empleado ' campo de clase
Public psNombre As String
' variables de propiedad
Private mdtFechaAlta As Date
Get
Return mdtFechaAlta
End Get
Set(ByVal Value As Date)
mdtFechaAlta = Value
End Set
End Property
' propiedad virtual en ella devolvemos el nombre del mes en el que se ha dado de alta
al empleado, utilizando la variable de otra propiedad
Public ReadOnly Property MesAlta() As String
Get
Return Format(mdtFechaAlta, "MMMM")
End Get
End Property
End Class
Return msNombre
End Get
Set(ByVal Value As String)
msNombre = Value
End Set
End Property
End Class
Propiedades predeterminadas
Sub Main()
Dim loEmpleado As New Empleado()
Dim liContador As Integer
' primero manejamos la propiedad predeterminada igual que una normal
loEmpleado.Viajes(0) = "Valencia"
' aqu manipulamos la propiedad predeterminada sin indicar su nombre
loEmpleado(1) = "Toledo"
For liContador = 0 To 1
Console.WriteLine("Visita: {0} - Ciudad: {1}", _ liContador,
loEmpleado(liContador))
Next
Console.ReadLine() End Sub End Module
Public Class Empleado
' este es el array asociado a ' la propiedad predeterminada
Private msViajes() As String
' declaracin de la propiedad predeterminada
Default Public Property Viajes(ByVal Indice As Integer) As String
Get ' para devolver un valor, empleamos el nmero de ndice pasado como
parmetro
Return msViajes(Indice)
End Get
Set(ByVal Value As String)
' para asignar un valor a la propiedad, ' comprobamos primero si el array est
vaco comprobar si el array est vaco, al ser el array tambin un objeto,
utilizamos el operador Is
If msViajes Is Nothing Then
ReDim msViajes(0)
Else ' si el array ya contena valores, aadir un nuevo elemento
ReDim Preserve msViajes(UBound(msViajes) + 1)
End If
' asignar el valor al array
msViajes(Indice) = Value
End Set
End Property
End Class
' estas dos lneas son equivalentes, ' asignan valores a la propiedad
Text txtCaja.Text = "coche"
txtCaja = "tren"
Debido a la restriccin impuesta por VB.NET, que nos obliga a que las
propiedades predeterminadas sean un array, el uso de Set deja de tener
sentido, ya que siempre que hagamos referencia a una propiedad
predeterminada tendremos que usar el ndice de su array, generndose un
cdigo ms claro y eliminando la incomodidad de usar Set para cada
asignacin de objetos a variables. Ver el Cdigo fuente 216.
' esto es cdigo VB.NET =====================
Dim loEmpleado As Empleado
' como la propiedad predeterminada es un array, ' siempre debemos trabajar con sus
ndices
loEmpleado.Viajes(0) = "Valencia"
' .... ' .... ' asignamos otro objeto Empleado a la variable ' sabemos claramente que es
una asignacin ' porque no estamos manejando el ndice de la ' propiedad
predeterminada del objeto
loEmpleado = loOtroEmp