PROGRAMACIÓN ORIENTADA A OBJETOS Y DIAGRAMA DE CLASE UML
Las personas tienen una idea clara de lo que es un objeto: conceptos adquiridos que nos permiten sentir y razonar acerca de las cosas del mundo. Un objeto podría ser real o abstracto, por ejemplo una organización, una factura, una figura en un dibujador, una pantalla de usuario, un avión, un vuelo de avión, etc. En el análisis y diseño orientados a objetos (OO), interesa el comportamiento del objeto. Si se construye software, los módulos de software OO se basan en los tipos de objetos. El software que implanta el objeto contiene estructuras de datos y operaciones que expresan dicho comportamiento. Las operaciones se codifican como métodos. Las representación en software OO del objeto es entonces una colección de tipos de datos y objetos.
Tipos de Objetos Los conceptos que poseemos se aplican a tipos determinados de objetos. Por ejemplo, empleado se aplica a los objetos que son personas vinculadas por alguna organización. Algunas instancias de empleado podrían ser Juan Pérez, José Martínez, etc. En el análisis Orientado a objetos, estos conceptos se llaman tipos de objetos; las instancias se llaman objetos. Así, un tipo de objeto es una categoría de objeto, mientras que un objeto es una instancia de un tipo de objeto. En el mundo de las bases de datos existen los tipos de entidad, como cliente o empleado. Existen muchas instancias de cada tipo de entidad (como Juan Pérez o José Martínez para el tipo de entidad empleado). Del mismo modo, en OO se define tipos de objetos e instancias de tipo de objeto. Sin embargo, el término objeto tiene diferencias fundamentales con el término entidad, ya que la entidad sólo se refiere a los datos, mientras que objeto se refiere a los datos y a los métodos mediante los cuales se controlan a los propios datos. En OO, la estructura de datos y los métodos de cada tipo de objeto se manejan juntos. No se puede tener acceso o control de la estructura de datos excepto mediante los métodos que forman parte del tipo de objeto.
Métodos Los métodos especifican la forma en que se controlan los datos de un objeto. Los métodos en un tipo de objeto sólo hacen referencia a la estructura de datos de ese tipo de objeto. No
deben tener acceso directo a las estructuras de datos de otros objetos. Para utilizar la estructura de datos de otro objeto, deben enviar un mensaje a éste. El tipo de objeto empaca juntos los tipos de datos y su comportamiento. Un objeto entonces es una cosa cuyas propiedades están representadas por tipos de datos y su comportamiento por métodos. Un método asociado con el tipo de objeto factura podría ser aquel que calcule el total de la factura. Otro podría transmitir la factura a un cliente. Otro podría verificar de manera periódica si la factura ha sido pagada y, en caso contrario, añadir cierta tasa de interés.
Características de una clase
La clase es la base de la Programación Orientada a Objetos. Cualquier concepto que se desee representar en un programa Java debe ser modelado con una clase. Una clase es una plantilla o modelo de un objeto. En ella se definen los atributos y los comportamientos de un tipo de objeto. Al definir una clase debo especificar los datos que contiene (atributos) y el código que opera sobre ellos (métodos). Los métodos definen la interfaz con la que se manejaran los datos.
A continuación continuación un un ejemplo de cómo definir definir una clase. clase.
La implementación con el método main quedaría:
Ejemplo 2
CONSTRUCTORES EN JAVA Un Constructor es una función ó método de la clase, la cual es llamada automáticamente cuando se crea un objeto de dicha clase. Por ser métodos, los constructores también aceptan parámetros. Cuando en una clase no especificamos ningún tipo de constructor, el compilador añade uno público por omisión sin parámetros, el cual NO hace nada.
Características de los Constructores 1. Un constructor, tiene el mismo nombre de la clase a la cual pertenece. 2. No puede ser Heredado. 3. No retorna ningún valor (Ni void), por lo cual no debe especificarse ningún tipo de dato.
4. Debe declararse como public, sólo en casos realmente extraordinarios será de otro tipo. Ejemplo
La implementación con el método main quedaría:
A continuación crearemos una clase denominada Persona, que nos permite crea r objetos del tipo de dicha clase. Todo objeto de tipo Persona estará definido por dos campos: nombre (tipo String) y edad (tipo entero), y admitirá un método: getNombre(). Al realizar la invocación nombreDelObjeto.getNombre () obtendremos el atributo nombre del objeto.
La clase tiene dos constructores. ¿Qué significado tiene esto? Pues que
podremos crear personas de dos maneras distintas: a) Personas que se creen con el constructor 1: debe indicarse, además del nombre del objeto, el parámetro que transmite el nombre de la persona. b) Personas que se creen con el constructor 2: no requieren parámetros para su creación y se inicializan a unos valores por defecto (nombre cadena vacía y edad cero). Cuando más de un constructor o método tienen el mismo nombre pero distintos parámetros decimos que el constructor o método está sobrecargado. La sobrecarga de constructores o métodos permite llevar a cabo una tarea de distintas maneras (por ejemplo crear un objeto Persona con un nombre ya establecido o crearlo sin nombre establecido). La existencia de dos constructores se ha visto reflejada en que disponemos de más de una opción de new Persona para crear objetos. Según la opción que elijamos, el objeto Persona se creará de una forma u otra. Esto nos lleva a la conclusión de que cada constructor define una forma de crear objetos.
Palabra reservada THIS Es una referencia al objeto actual, usándose:
En los métodos de instancia
En los métodos de un constructor
Se usa para hacer referencia a cualquier miembro del objeto actual, para diferenciar variables de instancia de variables locales y para invocar un constructor dentro de otro constructor.
Ejemplo 3 Implementación de una clase para calcular el área de un rectángulo y de un circulo, para cada una de las áreas utilizar un constructor.
La implementación del método máin quedaría:
Sobrecarga de Métodos La sobrecarga de métodos consiste en crear varios métodos con el mismo nombre que actúen diferente según el tipo de los parámetros de entrada. Por ejemplo, queremos hacer un método que devuelva el resultado de la suma de los dos parámetros de entrada, pero no sabemos si será un entero o si tendrá
decimales, así que tendremos que hacer un método para el caso de los decimales, y otro con el mismo nombre para el caso de los enteros.
La implementación del Main quedaría:
Ejercicios propuestos Diseñe una clase colegio, cuyos atributos sean nombre del profesor, número de materias y nombre del estudiante. Se deben crear dos constructores uno que permita posteriormente visualizar por medio de objetos el nombre del profesor y del estudiante, y otro constructor que permita visualizar los tres atributos de la clase. Implemente los métodos necesarios. Teniendo en cuenta que si el número de materia es superior a 5 se debe imprimir un mensaje de error. 2. Implemente una clase que permita calcular el área de 4 figuras geométricas utilizando la sobreescritura de métodos.
3. Cree una clase NumeroDecimal, defina dos propiedades (variables atributos) que son: entero, decimal; como lo indican sus nombres, representan a un número decimal. Implemente los métodos para la clase NumeroComplejo así:
Método que muestre en pantalla el valor de cada propiedad
Método que inicialice el objeto con cualquier valor (constructor)
Método que reciba un número decimal y devuelva el cuadrado del mismo
Método que calcule el factorial de la parte entera de este objeto.
4. El banco la caridad requiere la implementación de una solución en java que permita conocer el estado de cuenta de sus dos principales clientes. Se debe tener en cuenta lo siguiente.
El cliente 1 debe permitir visualizar nombre, numero de la cuenta, saldo actual, ultimo retiro. El cliente 2 debe permitir visualizar el nombre, la cedula, número de cuenta, saldo actual, ultimo retiro, descuento (teniendo en cuenta que es del 10 % sobre cada retiro) Implemente los constructores y métodos de la clase, así como el método main para la creación de objetos y despliegue de la información.
HERENCIA La idea de la herencia es permitir la creación de nuevas clases basadas en clases existentes. Cuando heredamos de una clase existente, reusamos (o heredamos) métodos y atributos, y agregamos también nuevos atributos y métodos para cumplir con la situación deseada. Cada vez que encontremos la relación "es-un" entre dos clases, estamos ante la presencia de herencia. El concepto de herencia conduce a una estructura jerárquica de clases o estructura de árbol, lo cual significa que en la POO todas las relaciones entre clases deben ajustarse a dicha estructura. En esta estructura jerárquica, cada clase tiene sólo una clase padre. La clase padre de cualquier clase es conocida como su superclase. La clase hija de una superclase es llamada una subclase.
* Una superclase puede tener cualquier número de subclases. * Una subclase puede tener sólo una superclase.
La herencia en java se hace mediante la palabra extends. A continuación un ejemplo
Ahora implementamos la clase Estudiante, heredando atributos y métodos de la clase persona:
Ahora creamos la clase empleado, que también hereda de persona
Ahora creamos el método main para imprimir los datos de las clase creadas:
Ejercicios propuestos 1. La empresa informática “IPM Tech” necesita llevar un registro de todos sus empleados que se encuentran en la oficina central, para eso ha creado un diagrama de clases que debe incluir lo siguiente:
Empleado Atributos:
- nombre: tipo cadena (Debe ser nombre y apellido) - cedula: tipo cadena - edad: entero (Rango entre 18 y 45 años) - casado: boolean - salario: tipo numérico doble Métodos: - Constructor con y sin parámetros de entrada. - Método que permita mostrar la clasificación según la edad de acuerdo al siguiente algoritmo: Si edad es menor o igual a 21, Principiante Si edad es >=22 y <=35, Intermedio Si edad es >35, Senior. - Imprimir los datos del empleado por pantalla (utilizar salto de línea \n para separar los atributos.
- Un método que permita aumentar el salario en un porcentaje que sería pasado como parámetro al método.
Programador (Especialización de Empleado). Clase que hereda de Empleado todos los atributos y métodos.
- Atributos- Constructor con y sin parámetros de entrada : - lineasDeCodigoPorHora: tipo entero - lenguaje Dominante: tipo cadena
- Métodos: - Constructor con y sin parámetros de entrada. 2. Realizar la siguiente aplicación utilizando clases, herencia, métodos, propiedades, constructores · Desarrollar un ecosistema, en donde se puedan crear tener distintos animales de todas las clasificaciones: mamíferos, aves, reptiles y anfibios. Se deben de crear clases para cada tipo de especie, y para las especies más comunes que el programador quiera definir. El usuario final debe tener la potestad de crear todos los animales (instancias) que desee, y diferenciarlas de acuerdo a algún identificador.
POLIMORFISMO El polimorfismo consiste en obtener un mismo método con diferentes funciones. En general nos sirve para programar objetos con características comunes y que todos estos compartan la misma superclase en una jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programación. El polimorfismo se puede establecer mediante sobrecarga, sobre-escritura y enlace dinámico.
Polimorfismo por Sobrecarga La sobrecarga de métodos hace que un mismo nombre pueda representar distintos métodos con distinto tipo y número de parámetros, manejados dentro de la misma clase. En el ámbito de la POO, la sobrecarga de métodos se refiere a la posibilidad de tener dos o más métodos con el mismo nombre pero distinta funcionalidad. Es decir, dos o más métodos con el mismo nombre realizan acciones diferentes y el compilador usará una u otra dependiendo de los parámetros usados. Esto también se aplica a los constructores (de hecho, es la aplicación más habitual de la sobrecarga).
Podemos diferenciar varios métodos sobrecargados a través de sus parámetros, ya sea por la cantidad, el tipo o el orden de los mismos. Veamos un ejemplo:
Polimorfismo por sobreescritura La sobreescritura se aplica a los métodos y está directamente relacionada a la herencia; se refiere a la redefinición de los métodos de la clase base en las subclases.
Por ejemplo, en la relación de herencia del ejemplo de las figuras aunque la clase base “Figura” tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases “Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo” redefinen estos métodos ya que el cálculo del área y el perímetro de cada uno de ellos es diferente.
Ejemplo 2
Definimos la clase numero y las clases hijas Numero positivo y Numero negativo
Las clases hijas implementan los métodos numero próximo, en la primera clase se define un contador incremental, en la segunda clase (numero negativo) se toma como referencia un contador decremental. Luego se invocan los objetos en el método Main
El resultado de este programa es el siguiente: Numero Numero Numero Numero Numero Numero
positivo inicial: 0 negativo inicial: 0 positivo siguiente: 1 negativo siguiente: -1 positivo siguiente: 2 negativo siguiente: -2.
La conclusión que debemos observar en este ejemplo es que se tienen dos instancias de Numero, una instancia de NumeroPositivo y una de NumeroNegativo, cada cual tiene un comportamiento distinto. Sin embargo a la hora de declararlo se los declaro en su forma genérica de Numero y se tiene el método próximo () asociado. El polimorfismo ha permitido que cada uno se comporte de manera distinta, y sin embargo parece llamarse siempre al mismo método. Es decir, es distinto el próximo negativo del próximo positivo, y eso se refleja en el resultado. Otra cosa que puede verse en este ejemplo es que al imprimir los objetos positivos y negativos se llama automáticamente al método toString () , es el modo en el que Java imprime sus objetos en pantalla. Y el aprovechamiento del mecanismo de herencia, en la programación del método toString () que retorna el valor de numero como un String, es decir, algo que puede imprimirse fácilmente. Al llamarlo en un NumeroPositivo, como este no lo tiene programado, se ejecuta el que esta definido en la clase padre Numero. Al llamarlo en un NumeroNegativo también se llama al de la clase padre.
Polimorfismo por Enlace dinámico Esto permite invocar operaciones en objetos obviando el tipo actual de éstos hasta el momento de ejecutar el código. O sea, nos permite definir elementos como un tipo e instanciarlos como un tipo heredado. Pero ¿qué utilidad tiene obviar el tipo de un objeto para luego tomar esta decisión?. Gracias a que en java la definición de los tipos de objetos se puede producir por enlazado posterior ( late binding ), no nos debe preocupar a qué tipo de elemento le paso un mensaje, ya que el compilador tomará la decisión sobre qué objeto ejecutará qué método de acuerdo a la forma de crear la instancia. Este concepto es bastante complejo de entender, ya que estamos acostumbrados a definir los elementos de acuerdo a lo que necesitamos. Es decir, si requiero un entero lo declaro como entero; ¿para qué declarar un elemento como un tipo y luego usarlo como otro? La respuesta está en que no siempre se puede determinar exactamente el tipo de elemento que va a usarse en la ejecución de nuestro programa. Se debe tener por lo menos una relación de herencia que permita determinar un tipo base para la declaración, sea cual sea el subtipo que se instancie. Veamos un ejemplo que nos aclare un poco las cosas:
Vemos que el método “muévete” llama al método mover de un mamífero y aunque no sabe con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera el enlace dinámico, tendríamos que crear un método “muevete” para los mamíferos de tipo “Gato” y otro para los de tipo “Perro”.
EJERCICIOS PROPUESTOS
1. Cree una clase Cilindro que herede las propiedades y el comportamiento de una clasemadre llamada circulo que tiene el atributo radio y los métodos área y perímetro. La clase cilindro debe tener el atributo altura, así como los métodos área y volumen. Implemente una función main() que haga uso de la clase Cilindro y muestre por pantalla el área del circulo y cilindro, así como el perímetro del circulo y volumen del cilindro. 2. Crear una clase vehículo y dos clases derivadas; vehículo terrestre y vehículo aéreo. La clase base definirá el atributo consumo_gasolina y un método costo_viaje a partir de los parámetros km_recorridos y litros_por_km. Las clases derivadas vehiculoTerrestre con los atributos velocidad y tiempo y vehículo Aéreo con los atributo horas_de_vuelo y Km_por_horavuelo. Además deberán ofrecer ambas el método costoviaje. Escribir una función main() que cree objetos de las clases derivadas y que permita obtener los costos a partir de un tipo de vehículo.
DIAGRAMAS DE CLASE El diagrama de Clase muestra los bloques de construcción de cualquier sistema orientado a objetos. Los diagramas de clases describen la vista estática del modelo o parte del modelo, describiendo que atributos y comportamientos tienen en lugar de detallar los métodos para realizar operaciones. Los diagramas de Clase son más útiles para ilustrar relaciones entre clases e interfaces. Las generalizaciones, agregaciones, y asociaciones son todas valiosas al reflejar herencias, composición o uso, y conexiones respectivamente.
Clases Una clase es un elemento que define los atributos y comportamientos que un objeto podrá generar. El comportamiento es el que se describe por posibles mensajes que la clase pueda comprender conjuntamente con las operaciones que son apropiadas para cada mensaje. Las clases pueden también contener definiciones de valores etiquetados de restricciones y estereotipos.
Notación de Clase
Para modelar un diagrama de clases UML se deben tener en cuenta los siguientes aspectos: 1. Una clase se representan como un rectángulo dividido en tres partes (tres compartimentos). 2. En el compartimento superior, centrado, va el nombre de la clase. 3. El segundo compartimento contiene los atributos, en la forma: visibilidad nombre Atributo: tipo 4. El tercer compartimento contiene los métodos, en la forma: visibilidad nombreMétodo (parámetros): tipoRetorno. 5. Los parámetros van separados por comas y sólo se especifica el tipo. 6. Los constructores no tienen tipo de retorno. 7. La visibilidad, de atributos y métodos, puede ser:
- privado + público # protegido ~ de paquete Ejemplo:
Es posible representar una clase usando sólo el compartimento del nombre, o el compartimento del nombre y uno de los dos siguientes (atributos o métodos). Cuando se representa una clase de esta forma no es posible deducir nada de los compartimentos faltantes.
Tipos de Relación entre clases Asociación Una asociación implica que dos elementos del modelo tienen una relación – usualmente implementada como una variable de instancia de una clase. Este conector puede incluir roles nombrados en cada extremo, cardinalidad, dirección y restricciones. Una asociación es el tipo de relación general entre elementos. Para más de dos elementos, un elemento de la caja de herramientas de representación diagonal también se puede usar. Cuando se genera código para diagramas de clase, las asociaciones se convierten en variables de instancia en la clase de destino. Una asociación (relación entre dos clases) se representa como una línea continua entre dos clases, y puede tener el nombre de la relación sobre esta línea. Ejemplo:
En el ejemplo anterior cada Avión tiene una relación con Piloto, pero también cada Piloto tiene relación con Avión. Esta es una relación en ambos sentidos.
En este ejemplo un Pasajero conoce el Avión (o aviones) con el cual viaja, pero el Avión no tiene ninguna relación con los Pasajeros.
Agregación
Las agregaciones se usan para describir elementos que están compuestos de componentes más pequeños. Las relaciones de agregación se muestran por una punta de flecha con forma de diamante apuntando hacia el destino o clase padre.
En este caso tenemos una clase empresa que agrega una clase cliente y una clase empleados.
Composición Los componentes constituyen una parte del objeto compuesto. De esta forma, los componentes no pueden ser compartidos por varios objetos compuestos. La supresión del objeto compuesto conlleva la supresión de los componentes. El símbolo de composición es un diamante de color negro colocado en el extremo en el que está la clase que representa el “todo” (Compuesto) .
• Tenemos una clase Empresa . • Un objeto Empresa está a su vez compuesto por uno o varios objetos del tipo empleado. • El tiempo de vida de los objetos Empleado depende del tiempo de vida de Empresa, ya que si no existe una Empresa no pueden existir sus empleados.
Diferencias entre composición y agregación
Herencia Consiste en la relación entre una superclase y sus subclases. Los objetos de distintas clases pueden tener atributos similares y exhibir comportamientos parecidos ( ej: animales, mamíferos ) La herencia se representa con una línea continua que va de la clase hija a la clase padre, y que termina en un triángulo vacío. Ejemplo: