Está en la página 1de 11

Características POO Elementos

1. Abstracción 1. Clases
2. Encapsulamiento a. Métodos
3. Herencia i. Sobre Escritura
4. Polimorfismo ii.Sobrecarga
5. Relaciones b. Atributos
a. Asociaciones c. Propiedades(Solo .Net)
i. Composición 2. Objetos
ii.Agregación a. Mensajes
b. Herencia 3. Interfaces

1. Abstracción
 Ignorancia Selectiva

○ La abstracción nos ayuda a trabajar con cosas complejas

○ Se enfoca en lo importante

○ Ignora lo que no es importante (simplifica)

 Una clase es una abstracción en la que:

○ Se enfatizan las características relevantes

○ Se suprimen otras características

 Una clase debe capturar una y solo una abstracción clave

El proceso de abstracción permite seleccionar las características relevantes dentro de un


conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en
el mundo real. La abstracción es clave en el proceso de análisis y diseño orientado a
objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan
modelar la realidad o el problema que se quiere atacar.

2. Encapsulamiento
 Principio que establece que los atributos propios de un objeto no deben ser
visibles desde otros objetos

○ Deben ser declarados como privados

 Permite abstraer al resto del mundo de la complejidad de la implementación


interna
 Permite exponer el estado del objeto sólo a través del comportamiento que le
hayamos definido mediante miembros públicos

 ¿Por qué es útil?

○ Punto de Control/Validación

○ Mejor respuesta ante los Cambios

Otro de los pilares de la orientación a objetos es el encapsulamiento. Para entender este


principio veamos un ejemplo práctico:

Como todos ustedes se imaginarán, no es necesario ser mecánico de automóviles para


poder manejar uno. Si el comprender cómo es el funcionamiento interno del motor, la
dirección, los frenos, los cilindros, etc. fuera requisito para poder manejar un automóvil,
serían muchos menos los conductores certificados y sería mucho más difícil aprender a
manejar. Es más, si a cualquier automotriz se le ocurriera cambiar el funcionamiento
interno de alguna de estas cosas, probablemente todos los conductores tendrían que
volver a aprender cómo funciona el nuevo componente interno para poder seguir
manejando sin problemas. Por suerte esto no es así, ya que la complejidad interna del
funcionamiento de un automóvil está escondida de los conductores (usuarios). Para poder
interactuar con el automóvil, éste nos expone una interfaz sencilla y definida, que no
cambia nunca por más que cambien internamente el funcionamiento de sus componentes.
Esta interfaz está compuesta por el volante, los pedales, la palanca de cambios, el
asiento, etc. De esta forma decimos que el automóvil ha encapsulado su complejidad
interna.

3. Herencia
 Es una relación entre clases en la cual una clase comparte la estructura y
comportamiento definido en otra clase (Grady Booch)

 Cada clase que hereda de otra posee:

○ Los atributos de la clase base además de los propios

○ Soporta todos o algunos de los métodos de la clase base

 Una subclase hereda de una clase base


 Herencia “Es-Un”: herencia real, donde la subclase es un tipo específico de la
superclase
○ Un Cuadrado es un Rectángulo
○ Un perro es un mamífero
○ Un automóvil es un vehículo a motor

El propósito principal de la herencia es el de organizar mejor las clases que componen


una determinada realidad, y poder agruparlas en función de atributos y comportamientos
comunes a la vez que cada una se especializa según sus particularidades.

Cabe aclarar además que hay dos tipos de herencias:


– Herencia Simple: una clase derivada puede heredar sólo de una clase base (los
lenguajes .NET soportan este tipo de herencia)

– Herencia Múltiple: una clase derivada puede heredar de una o más clases base
(C++ es un ejemplo de lenguaje que soporta este tipo de herencia).

4. Polimorfismo
 Es la propiedad que tienen los objetos de permitir invocar genéricamente un
comportamiento (método) cuya implementación será delegada al objeto
correspondiente recién en tiempo de ejecución

 El polimorfismo tiende a existir en las relaciones de herencia, pero no siempre es


así

 La definición del método reside en la clase base

 La implementación del método reside en la clase derivada

 La invocación es resuelta al momento de ejecución

Aquí tenemos un ejemplo práctico de la implementación de polimorfismo en un diseño


orientado a objetos. Por un lado tenemos la clase base “Transporte”, que posee los
métodos “Avanzar” y “Frenar”. Por otro lado tenemos tres clases distintas derivadas de la
clase “Transporte”, cada una de las cuales podrá sobrescribir la implementación de los
métodos Avanzar y Frenar para que su comportamiento sea más específico.

Ahora bien, como todas heredan de la misma clase base, las clases derivadas pueden ser
tratadas genéricamente. Esto quiere decir que podríamos tener un array que almacene
objetos de tipo Transporte, y recorrerlo luego para llamar al método “Avanzar” de cada
uno. De esta forma, en tiempo de codificación es imposible saber a qué método “Avanzar”
se está llamando en realidad (al del Auto? Al del caballo? Al del transbordador?), sino que
esta decisión es tomada en tiempo de ejecución en base al tipo particular de objeto que
esté instanciado.

En pseudocódigo, esto se escribiría de la siguiente manera:

Definir arrayTransportes (3) de tipo Transporte

arrayTransportes(1) = nuevo Automóvil() //Un automóvil ES UN TIPO DE transporte

arrayTransportes(2) = nuevo Transbordador() //Un Transbordador ES UN TIPO DE


transporte
arrayTransportes(3) = nuevo Caballo() //Un Caballo ES UN TIPO DE transporte

Por Cada (Transporte t en arrayTransportes)

t.Avanzar()

t.Frenar()

Fin

5. Relaciones
 Todo sistema abarca muchas clases y objetos
 Los objetos contribuyen en el comportamiento de un sistema colaborando entre si
○ La colaboración se logra a través de las relaciones
 Existen dos tipos principales de relaciones
○ Asociación
○ Agregación

Asociación

 Una asociación es una conexión entre dos clases que representa una
comunicación

○ Una asociación puede tener nombre

○ La comunicación puede ser tanto uni como bi-direccional (por defecto)

○ La multiplicidad es el número de instancias que participan en una


asociación

 Ejemplo:

○ Una Persona es Dueña de un Vehículo

○ Un Vehículo Pertenece a una Persona

Persona -dueño Vehiculo

Agregación

 La agregación es una forma especial de asociación donde un todo se relaciona


con sus partes
○ También se conoce como “una parte de” o una relación de contención

 Ejemplo:

○ Una Puerta es una parte de un Vehículo

○ El Vehículo es azul, la Puerta es Azul

○ Mover el Vehículo implica mover la Puerta

Vehiculo Puerta
-color
+Mover()

 Herencia:
Es la capacidad de los progenitores de transmitir un conjunto de características a
su descendencia. En POO brinda la capacidad de derivación de una entidad a
partir de otra que le "transmite" su comportamiento, siendo la relación jerárquica
de tipo "es un".
Por ejemplo: Un Felino "es un" Mamífero que a su vez "es un" Animal.
La Herencia, también conocida como Generalización, establece que:
• Algunas entidades son más generales.
• Algunas otras son especializaciones de las anteriores.
Por ende todos los objetos derivan de una clase superior y heredan la estructura
de datos y las operaciones que han sido definidas para dicha clase. Para ello al
diseñar las clases se clasifican de acuerdo al conjunto de características o
funciones similares entre ellas.
Esto permite crear nuevas representaciones abstractas especializadas a partir de
otra más general de la cual heredan su implementación, permitiendo reutilizar el
código y concentrarse sólo en agregar nuevas características. Del ejemplo
anterior, la representación abstracta de Animal es la más general de todas y de la
cual se especializan tanto las representaciones abstractas de Mamífero y Felino,
quienes a su vez heredan la implementación de Animal y cuyas implementaciones
sólo añaden nuevos comportamientos especializados [1].

Clases
Dado que los objetos se crean a partir de clases, son las clases las que tenemos que
diseñar y construir. Para ellos debemos recordar que las clases se componen de los
siguientes elementos o miembros:
 Métodos: Representan acciones que un objeto puede realizar.
 Atributos: Representan la información que contiene un objeto (estado).
Adicionalmente las clases puede definir Eventos, que son notificaciones que un objeto
recibe de, o transmite a, otros objetos, cuando se produce un acontecimiento
específico.
También existen los miembros compartidos de clase, que pueden utilizarse en
instancias de una clase y en variables de objeto declaradas como tipo de la clase. En
otras palabras, no requieren una instancia de clase en específico para realizar su
cometido.
VB5 introdujo el concepto de módulo de clase en el cual podían definirse clases
simples, una por cada múdulo. Con VB.NET se pueden crear cualquier número de
clases en un mismo archivo, no obstante es una buena práctica el definir clases en
archivos separados. Para definir una clase se emplea, como entonces, la palabra
clave Class:
Class CCliente
'TODO: Miembros de clase
End Class
Si se requiere, también se pueden crear clases anidadas, es decir, clases dentro
de otras clases. Que resulta útil cuando cierto objeto va a ser utilizado al interior de
otro y nunca fuera del mismo.
Ahora como experimento abra el entorno de Visual Studio (o bien su Visual Basic
.NET Standard ó VB2005 Express) y genere una nueva Aplicación Windows.
Despues abra el archivo de código fuente del formulario y observe que inicia con
algo como:
Public Class Form1
Lo cual implica que el formulario se construye a partir de una Clase.
Incluso ahora los Modulos de código son clases, la única diferencia es que se trata
de Clases estáticas con mienbros compartidos.
Ahora pasemos a definir los miembros de la clase: los atributos y métodos [2]

Atributos
Los atributos de clase se representan mediante Campos o Propiedades. Los
Campos se implementan mediante variables públicas que se pueden leer y
establecer directamente desde el exterior de la clase.
Public Nombre As String
Mientras que las Propiedades se recuperan y establecen como los Campos, pero
se implementan mediante procedimientos Property Get y Property Set. El acceso a
los atributos mediante procedimientos proporciona un mayor control sobre la forma
en que se establecen o se devuelven los valores de los atributos; esto ayuda a
aislar los datos y permite validar valores antes de ser asignados o recuperados.
Por ello también podriamos ver a las Propiedades como métodos de clase ya que
encajan en la definición y propósito de los mismos. De hecho en lenguajes como
Java no existen las propiedades y las operaciones de asignación (Set) y obtención
(Get) del valor de los atributos se realizan mediante métodos.
Se puede definir una propiedad de la siguiente manera:
' Ahora el atributo es Privado
Private strNombre As String
' Para ser accesible mediante la Propiedad
Property Nombre() As String
Get
Return strNombre
End Get
Set(ByVal Value As String)
strName = Value
End Set
End Property
El procedimiento Get devuelve el valor de la propiedad, mientras que el
procedimiento Set le asigna el valor a la propiedad. Observe que dado que todo en
.NET es un objeto ya no es necesario la sentencia Let, así como que ambos
procedimientos están contenidos dentro una sola sentencia Property, lo cual hace
mas fácil de manipular y mantener el código de la Propiedad.
En aplicaciones de N-capas las clases generalmente se diseñan sin estado, es
decir sin propiedades [3]
Métodos
Los métodos de una clase en VB.NET se implementan mediante procedimientos o
subrutinas (Sub) y funciones (Function) declarados dentro de una clase, de la
misma manera como se realizaba anteriormente. No obstante ahora para devolver
el valor desde una función se utiliza la palabra clave Return en lugar del nombre
de la misma, el cual además se puede utilizar en los diferentes puntos de salida de
la función:
Function Hola() As String
If Nombre <> "" Then
Return "Hola " & Nombre
Else
Return "Hola Mundo"
End If
End Function
Aún se puede seguir utilizando, por compatibilidad hacia atrás, el nombre de la
función para devolver el valor. Mas es recomendable utilizar Return dado que tiene
un comportamiento más estructurado [4]

Sobrecarga

Sobrecarga: varios métodos con el mismo nombre pero diferente “firma”.

Public Sub HacerDeposito(ByVal imp As Integer)

End Sub

Public Sub HacerDeposito(ByVal imp As Integer, ByVal acreditar As Boolean)

End Sub

Propiedades
Las propiedades permiten implementar el encapsulamiento, impidiendo el acceso
directo a los atributos de una clase y proporcionando un mecanismo para poder
obtener y asignar sus valores.
Nótese que como VB.NET no distingue entre mayúsculas y minúsculas no es
posible embargo, es importante que ambos tengan nombres significativos para la
lógica de la aplicación. No se recomienda el agregado de prefijos o sufijos a los
nombres.

Objetos y Mensajes
Hemos visto que la POO modela software utilizando objetos ligados para la
representación de sistemas. La manera en que la POO ve a un sistema es como
un conjunto de objetos que dialogan entre sí, intercambiando mensajes para
realizar las distintas tareas para las que ha sido concebido. Veamos como:
Cada objeto tiene unas características o propiedades particulares, los atributos, y
unas formas de operar sobre ellos, los métodos. Por otro lado, los objetos
interactúan recibiendo, interpretando y respondiendo a mensajes entre sí. Cada
mensaje está asociado a un método; cuando un objeto recibe un mensaje, la
respuesta es la ejecución del método asociado al mismo.
Las acciones que el objeto puede emprender se define por el comportamiento,
para definir este comportamiento hay que añadir métodos a la clase. Los métodos
son rutinas de código definidas dentro del cuerpo de la clase, que se ejecutan en
respuesta a alguna acción tomada dentro de un objeto de esa clase, o bien desde
otro objeto de la misma o de otra clase. Recuerde que los objetos se comunican
mediante mensajes. El conjunto de mensajes a los que un objeto puede responder
se corresponde con el conjunto de métodos que implementa su clase.
Los mensajes enviados entre los objetos dan lugar al procesamiento interno de
datos, siendo los atributos quienes definen el estado de un objeto al permitir
almacenar datos para el mismo. Normalmente dichos atributos se ocultan al
usuario del objeto - principio de encapsulación, manteniendo a los mensajes como
única conexión con el exterior. Los valores de los atributos, y en consecuencia el
estado del objeto, sólo pueden ser manipulados por el conjunto de métodos que se
corresponden con el conjunto de mensajes por los cuales un objeto se comunica.
Por lo que dichos métodos en conjunto reciben el nombre de interfaz: medio de
comunicación.
No obstante cuando decimos que un objeto recibe un mensaje, debemos entender
que el mensaje es un concepto que subyace en nuestra mente; la acción real es la
invocación del método que decimos responde a ese mensaje con el fin de
modificar el estado del objeto. Por esto podemos decir que los nombres de los
métodos de una clase forman el conjunto de mensajes a los que una instancia de
esa clase (el objeto) puede responder. Cualquier método de una clase puede
invocar a todos los otros miembros (atributos y métodos) de su clase. Pero un
objeto de esa clase sólo puede responder a los mensajes para los que fue
programado, es decir, sólo puede invocar a los métodos de su clase.
En primer lugar debemos tener en cuenta que todo en el .NET Framework, y por
ende en Visual Basic .NET, puede ser tratado como un objeto. Por ejemplo el tipo
Integer ahora posee propiedaes y métodos, tales como MaxValue que regresa el
valor máximo que puede contener:
Dim i as Integer
MsgBox(i.MaxValue)
Con VB.NET observamos que tipos "básicos" como Integer se tratan de objetos.
Del mismo modo, entidades tales como los formularios y controles son todos
instancias de alguna clase, es decir: objetos. Por ende una de las primeras cosas
que debemos tomar en cuenta es que el modo de tratar a éstos tipos a cambiado
con respecto a VB6 y versiones anteriores [5]

Interfaces
 Recurso de diseño soportado por los lenguajes orientados a objetos que permite
definir comportamiento
 Permite que clases que no están estrechamente relacionadas entre sí deban tener
el mismo comportamiento
 La implementación de una interfaz es un contrato que obliga a la clase a
implementar todos los métodos definidos en la interfaz

Vehiculo

Aereo Acuatico Terrestre

Avión Barco Automóvil

Suponiendo que estamos en un entorno donde sólo se soporta la herencia simple,


ante la jerarquía de clases planteadas: ¿De qué clase heredaría la clase
Hidroavión?
En teoría debería heredar tanto de Vehículo-Aéreo (ya que tiene atributos y
comportamientos propios de un avión, como “cantidad de alas” y “despegar”) como
de Vehículo-Acuático (ya que también tiene atributos y comportamientos propios
de un barco, como por ejemplo “capacidad de flotación” y “navegar”). Ahora bien,
como la herencia múltiple no se encuentra soportada según los parámetros del
problema debemos buscar otra solución. Aquí es donde el concepto de interfaces
se vuelve de gran utilidad.

 Se crean las interfaces que definen comportamiento


 Hidroavión deberá definir los comportamientos de cada una de las interfaces que
implemente
«interface» «interface»
Acuatico Aereo
+Navegar() +Volar()

Hidroavion

Una interfaz define un contrato de comportamientos que una clase debe cumplir al
implementarla. Los comportamientos declarados en la interfaz no tienen cuerpo ni
funcionalidad, son sólo “firmas” que las clases que implementen la interfaz
deberán completar. De esta forma, si bien no podemos lograr que la clase
derivada herede todos los atributos y comportamientos de su clase base, podemos
al menos “obligar” a que implemente el conjunto de funcionalidades definidas en la
interfaz.
 Una clase puede implementar tantas interfaces como desee, y una interfaz puede
ser implementada por tantas clases como se desee.

Infografía
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_1.aspx
1.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx
2.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx
3.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx
4.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_1.aspx
5.