Características POO 1. 2. 3. 4. 5.
Elementos
Abstracción Encapsulamiento Herencia Polimorfismo Relaciones a. Asociaciones i. Composición ii.Agregación b. Herencia
1. Clases a. Métodos i. Sobre Escritura ii.Sobrecarga b. Atributos c. Propiedades(Solo .Net) 2. Objetos a. Mensajes 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» Acuatico +Navegar()
«interface» Aereo +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.
1. 2. 3.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_1.aspx
Infografía http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx
4. 5.
http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_2.aspx http://dotnetjunkies.com/WebLog/vbpuntonet/articles/poo_vbnet_1.aspx