Vous êtes sur la page 1sur 30

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

3. PARADIGMA ORIENTADO A OBJETOS


3.1 PRESENTACIN DEL PARADIGMA ORIENTADO A OBJETOS
La programacin orientada objetos es una organizacin de los programas de forma tal que representen la interaccin entre elementos del mundo real: Un programa consta de un conjunto de objetos, que son abstracciones de elementos del mundo real. Cada objeto tiene un conjunto de atributos. Lo que importa es qu puede hacerse con dichos objetos ms que la forma en que se realiza. Los objetos interactan entre s por medio de mensajes. Cada objeto es una instancia de una clase. Las clases pueden organizarse jerrquicamente.

En las siguientes subsecciones se describen algunos de los principales conceptos que aparecen en el listado de caractersticas del paradigma orientado a objetos. 3.1.1 CLASES

Las clases se encargan de agrupar objetos con estados similares y que tienen el mismo comportamiento. Es decir, la definicin de la clase especifica el comportamiento de sus objetos, implementando mtodos, y las caractersticas de ellos por medio de los atributos. En el fondo, las clases no son ms que implementaciones de tipos de datos abstractos con sus respectivas operaciones. 3.1.2 OBJETOS

Un objeto es una entidad que exhibe un comportamiento y un estado interno, que se crea en tiempo de ejecucin. La forma en que se relacionan las clases y sus objetos se denomina instanciacin. Se dice que un objeto es una instancia de una clase. Los atributos y mtodos de un objeto estn determinados por la clase de la que es instancia.

30 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile 3.1.3 ATRIBUTOS

Lenguajes y paradigmas de programacin

Los atributos representan caractersticas de un objeto, dadas por valores. Permiten definir el estado de un objeto (atributos variables) u otras cualidades (atributos constantes). Considrese como ejemplo la clase automvil. Sus objetos tienen los siguientes atributos, donde los siete primeros indican cualidades del automvil (constantes) y los tres restantes indican la situacin en que se encuentra (variables): Marca. Modelo. Color. Ao. Patente. Potencia. Velocidad mxima. Velocidad. Aceleracin. Cantidad de combustible.

Dos instancias de esta clase podran ser las siguientes: Mi auto: Marca: Renault. Modelo: Megane. Color: beige. Ao: 2007. Patente: XW 5248. Potencia: 16 HP. Velocidad mxima: 180 Km/h. Taxi: Marca: Nissan. Modelo: V16. Color: Negro. Ao: 2005. Patente: TS 3051. Potencia: 16 HP. 31 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile 3.1.4 Velocidad mxima: 150 Km/h. MTODOS

Lenguajes y paradigmas de programacin

Son las operaciones u acciones que puede efectuar un objeto. Para el caso de la clase automvil, algunos mtodos pueden ser: Arrancar motor. Parar motor. Acelerar. Frenar. Virar a la derecha (grados). Virar a la izquierda (grados). Pasar cambio (nuevo cambio). Llenar estanque (dinero). PASO DE MENSAJES

3.1.5

La idea es que un objeto (el emisor) enva un mensaje a otro (el receptor), quien a su vez enva una respuesta al primero. Se utiliza el trmino paso de mensajes para referirse a la invocacin o llamada de un mtodo perteneciente a un objeto. As, un mensaje no es ms que una solicitud por parte del objeto emisor para que el objeto receptor se comporte de una manera determinada ejecutando uno de sus mtodos. Se puede concluir que los mensajes juegan un papel crucial en la programacin orientada a objetos. Sin ellos, los distintos objetos definidos no podran interactuar entre s. Desde la perspectiva imperativa, no obstante, un mensaje no es ms que una llamada a funcin. De esta ltima afirmacin se puede concluir que un mensaje puede contener informacin adicional en forma de parmetros. Un mensaje tiene, en general, la siguiente forma: miAuto.llenarEstanque(1000 pesos) donde: 32 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

miAuto es el objeto receptor. Ntese que la clase del objeto receptor no figura en el mensaje. Como respuesta al mensaje se debe ejecutar el mtodo llenarEstanque. 1000 pesos corresponde al parmetro requerido por el mtodo llamado. DISEO DE CLASES

3.1.6

Como se seal anteriormente, una clase especifica los atributos y mtodos del tipo de objetos que implementa. Se muestra ahora un ejemplo de cmo se disea y construye una clase. Clase CuentaBancaria Atributos: NombreTitular: Palabra NumeroCuenta: Palabra Saldo: Real Mtodos: asignarNombre(nombre: Palabra) asignarCuenta(cuenta: Palabra) asignarSaldo(saldo: Real) obtenerNombre(): Palabra obtenerCuenta(): Palabra obtenerSaldo(): Real girar(monto: Real) depositar(monto: Real) CuentaBancaria(nom: Palabra, cuenta: Palabra)

Algo importante que se desprende del diseo que se muestra para la clase CuentaBancaria es que existen mtodos para asignar (setter) y obtener (getter) los valores de los atributos. Otra observacin que se puede hacer es que aparece un mtodo con el mismo nombre de la clase. A este mtodo se le llama constructor y es el que permite crear una nueva instancia (es decir, un nuevo objeto) de esta clase. Este tipo especial de mtodo no lleva sentencia de retorno. En aquellos lenguajes orientados a objetos que no incorporan recoleccin de basura, como C++, es necesario crear adems un mtodo destructor que libere la memoria ocupada por un objeto una vez que ste es desocupado.

33 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Una implementacin de la clase CuentaBancaria en seudocdigo es la siguiente:


Clase CuentaBancaria { Palabra nombreTitular; Palabra numeroCuenta; Real saldo; void asignarNombre(Palabra nombre) { nombreTitular = nombre; } void asignarCuenta(Palabra cuenta) { numeroCuenta = cuenta; } void asignarSaldo(Real cantidad) { saldo = cantidad; } Palabra obtenerNombre() { retornar nombreTitular; } Palabra obtenerCuenta(){ retornar numeroCuenta; } Real obtenerSaldo(){ retornar saldo; } void depositar(Real monto) { saldo = saldo + monto; } void girar(Real monto) { si (saldo < monto) { mostrar(ERROR: saldo insuficiente); retornar; } saldo = saldo monto; } CuentaBancaria(Palabra nombre, Palabra cuenta) { nombreTitular = nombre; numeroCuenta = cuenta; saldo = 0; }

Muchas veces, al implementar una clase, no ser necesario crear un constructor. Las clases tienen un constructor por defecto, al cual no se entregan parmetros, que crea un objeto donde ningn atributo est inicializado. Este constructor tiene el mismo nombre de la clase. 34 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Un ejemplo de cmo se crean instancias de una clase y se usan sus mtodos, tambin en seudocdigo, es el siguiente:
main () { // Crear una nueva cuenta usando el constructor por defecto. CuentaBancaria miCuenta = nueva CuentaBancaria(); // Inicializar los atributos miCuenta.asignarNombre (Pedro Pablo Prez Pereira); miCuenta.asignarCuenta(001-56739-00); miCuenta.saignarSaldo(0); // Efectuar operaciones miCuenta.depositar(1000000); miCuenta.girar(50000); // Mostrar por pantalla los atributos. Se asume que mostrar es una // funcin disponible en una biblioteca. mostrar(miCuenta.obtenerNombre()); mostrar(miCuenta.obtenerCuenta()); mostrar(miCuenta.obtenerSaldo()); // Crear una nueva cuenta con el constructor implementado CuentaBancaria otraCuenta = nueva CuentaBancaria( Francisca Ortiz Lorca, 001-04934-00); }

3.2 HISTORIA DE LA PROGRAMACIN ORIENTADA A OBJETOS


La historia de los lenguajes orientados a objetos comienza en 1964, cuando aparece la primera versin de Simula. Este lenguaje surge como una extensin de Algol para la simulacin de eventos discretos. En 1967 aparece una nueva versin de Simula, con mayor cantidad de tipos de datos y apoyo a objetos. En 1972 aparece Smalltalk, lenguaje basado en Simula 67. La versin de este lenguaje aparecida en 1976 es completamente orientada a objetos, y en 1980 aparece la primera versin comercial. Smalltalk es un lenguaje bastante popular y su influencia puede observarse en lenguajes como C++ y Java, aunque estos ltimos han tenido un xito mucho mayor. A mediados de la dcada de 1990 la programacin orientada a objetos (POO) se desarroll como la metodologa de programacin dominante, en gran medida debido a la influencia de C++. Esta predominancia se vio ms profundamente cimentada por la creciente popularidad de las interfaces grficas de usuario, para lo que la POO es muy adecuada. Modula-2 es un lenguaje orientado a objetos que incluye los conceptos de abstraccin de datos y programacin modular. Oberon, sucesor de Modula-2, incluye un enfoque particular de la orientacin a objetos, distinto del de Smalltalk y muy diferente del de C++. Con el paso del tiempo se han agregado caractersticas de la orientacin a objetos muchos lenguajes, como Ada, BASIC, Lisp, Fortran y Pascal, entre otros. No obstante, la 35 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

incorporacin de estas caractersticas a menudo han causado problemas de mantencin y compatibilidad de cdigo. Durante los ltimos aos, Java ha surgido como un lenguaje muy utilizado, en parte gracias a su semejanza con C y C++ pero sobre todo por su implementacin que se sirve de una mquina virtual, cuya finalidad es ejecutar un mismo cdigo en distintas mquinas sin necesidad de cambios. Esta caracterstica lo ha hecho muy atractivo para grandes vendedores de software con ambientes heterogneos. La iniciativa .NET de Microsoft tiene un objetivo similar e incluye o da soporte a diversos lenguajes nuevos o variantes de lenguajes antiguos. En aos ms recientes ha surgido una gran cantidad de lenguajes que son principalmente orientados a objetos, aunque compatibles con la metodologa imperativa, tales como Python y Ruby. No obstante, los lenguajes orientados a objetos recientes ms importantes, comercialmente hablando, son Visual Basic .NET y C#, diseados para la plataforma .NET de Microsoft. As como la programacin imperativa llev a refinamientos tales como la programacin estructurada, los mtodos ms recientes de diseo de software orientado a objetos incluyen refinamientos tales como el uso de patrones, diseo por contrato y lenguajes especiales para modelar (como UML).

3.3 JAVA: UN LENGUAJE ORIENTADO A OBJETOS


3.3.1 CARACTERSTICAS DEL LENGUAJE

Java es un lenguaje de programacin orientado a objetos desarrollado por Sun Microsystems. Posee muchas caractersticas que hacen de l un lenguaje de alto nivel relativamente sencillo de utilizar y adecuado para diversos tipos de aplicaciones: Encapsulacin, herencia y polimorfismo (caractersticas de los lenguajes orientados a objetos que se discuten ms adelante en este captulo). Es un lenguaje fuertemente tipado. Es decir, ofrece mltiples tipos de datos elementales que facilitan la tarea del programador. Cuenta con gestin automtica de memoria (recoleccin de basura), lo que permite que programador no deba preocuparse por aspectos de administracin de memoria tales como la peticin y liberacin (funciones malloc() y free() de C/C++). Soporte para concurrencia (multihilo). Ofrece facilidades para el manejo de excepciones, es decir, para manejar dentro del programa las acciones a tomar en caso de error. 36 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Los constructores de las clases son independientes de la arquitectura del procesador. Cuenta con un gran conjunto de bibliotecas (conjuntos de clases): Interfaces grficas: AWT y Swing. Conectividad: sockets, RMI, JDBC. Funciones matemticas. Grficos 2-D y 3-D.

Es adecuado para trabajar en red (Web): Ejecutable en mltiples plataformas. Fcil de distribuir. Seguro. LA MQUINA VIRTUAL DE JAVA

3.3.2

Se seal en la seccin anterior que los constructores en Java son independientes de la arquitectura del procesador y que las aplicaciones escritas en este lenguaje pueden ser ejecutadas en diferentes plataformas. Esto se debe a la mquina virtual de Java (MVJ). Los programas escritos en Java se ejecutan en un computador simulado, llamado mquina virtual (ver figura 3.1). Al compilar un programa, se genera un programa equivalente escrito en otro lenguaje llamado Bytecode. La mquina virtual de Java no es ms que un intrprete de Bytecode.

37 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Figura 3.1: Contexto de la mquina virtual de Java Una de las grandes ventajas de este esquema es la portabilidad, pues para ejecutar un programa en un computador basta con tener instalada la mquina virtual correspondiente. Otra ventaja es que la mquina virtual brinda proteccin, pues permite tener un control muy detallado sobre las acciones que el cdigo en la mquina puede ejecutar. Esto permite ejecutar en forma segura el cdigo proveniente de fuentes remotas en las que no necesariamente se confa. Esto se logra ejecutando el cdigo en un entorno restringido, diseado para proteger al usuario de cdigo malicioso y de errores en el comportamiento del programa. La mquina virtual de Java es muy sofisticada. Realiza recoleccin de basura, con lo que el programador no debe preocuparse de liberar memoria que ya no est siendo utilizada. Tambin soporta aplicaciones multihilo, es decir, que corren dos o ms veces en forma simultnea. 3.3.3 JDK (Java Development Kit)

El kit de desarrollo de Java proporciona las herramientas necesarias para crear aplicaciones con Java: Bibliotecas bsicas. Herramientas bsicas: Javac: compilador de Java que genera archivos Bytecode (*.class) a partir de los archivos fuente (*.java). Java: intrprete de Java. jdb: depurador de lnea de comandos. javah: crea archivos de cabecera (*.h) y archivos fuentes de C (*.c) a partir de una clase Java. Estos archivos permiten la interaccin entre cdigo C y cdigo Java. Javadoc: genera documentacin de API (Application Programming Interface) en formato HTML a partir de los comentarios de documentacin en el cdigo fuente. AppletViewer: permite ejecutar applets1 sin usar un navegador. 3.3.4 TECNOLOGAS JAVA

Sun Microsystems ofrece tres ediciones diferentes de la plataforma Java: J2SE (Java 2 Standard Edition): es la edicin estndar para el desarrollo de aplicaciones y applets. J2EE (Java 2 Enterprise Edition): la edicin empresarial aade a la edicin estndar algunos componentes que permiten crear servidores para aplicaciones en forma ms sencilla. Es ideal para crear servlets2, JSP3 (Java Server Pages) y EJB4 (Enterprise Java Beans).
1

Un applet es un componente de software que se ejecuta en el contexto de otro programa (por ejemplo, un navegador).

38 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

J2ME (Java 2 Micro Edition): es una edicin especial que permite crear midlets, que son aplicaciones para dispositivos mviles. ELEMENTOS DEL LENGUAJE JAVA

3.3.5

A continuacin se muestra la aplicacin Hola mundo escrita en Java.


class HolaMundo { public static void main(String[] args) { System.out.println("Hola mundo"); } }

En este sencillo ejemplo se puede apreciar que la unidad fundamental de programacin en Java es la clase. Esto se debe a que Java crea y manipula objetos, y stos no son ms que instancias o ejemplares de una clase. 3.3.5.1 Definicin de clases Una definicin de clase en Java tiene la siguiente estructura:
Encabezado { Campos o atributos: /* Definen el estado de un objeto. */ Variables Constantes Mtodos: /* Definen el comportamiento de un objeto. */ Constructores Funciones }

El encabezado de una clase Java, en su forma ms elemental, viene dado por la palabra clave class seguida del nombre de la clase (los nombres de clases deben comenzar con mayscula) y finalmente los atributos y mtodos encerrados entre llaves.
class NombreClase { /* Definiciones de atributos y mtodos. */ }

No obstante, el encabezado de la clase puede incluir algunos modificadores que confieren caractersticas especiales a la clase creada, los cuales sern introducidos ms adelante.

Un servlet es un objeto que se ejecuta en un servidor o contenedor. Permite crear pginas Web dinmicas en un servidor. 3 Tipo particular de servlets que permite usar Java como script. 4 Los EJB proporcionan al programador un modelo que le permita abstraerse de los problemas generales de una aplicacin empresarial (concurrencia, transacciones, persistencia, seguridad, etc.) para centrarse en el desarrollo de la lgica de negocio en s.

39 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile 3.3.5.2 Creacin de objetos

Lenguajes y paradigmas de programacin

La creacin de objetos se hace mediante el operador new:


nombre_clase objeto = new nombre_clase();

As, para crear un objeto de la clase HolaMundo llamado saludo basta con escribir:
HolaMundo objeto = new HolaMundo();

3.3.5.3 Paquetes y especificadores de acceso Muchas veces es necesario crear utilidades o grupos temticos conformados por varias clases, llamados paquetes (los paquetes de Java pueden compararse con las bibliotecas de C). Para que una clase Java forme parte de un paquete es necesario indicarlo en el archivo fuente antes del encabezado de la clase por medio de la palabra reservada package. A continuacin se muestran tres clases que pertenecen a un mismo paquete:
// Archivo fuente Lapiz.java package escritorio; class Lapiz { // Miembros de la clase Lapiz } // Archivo fuente Goma.java package escritorio; class Goma { // Miembros de la clase Goma } // Archivo fuente Regla.java package escritorio; class Regla { // Miembros de la clase Regla }

Con las clases declaradas tal como estn, las clases Lapiz, Goma y Regla solo pueden ser utilizadas por otras clases definidas dentro del paquete escritorio. Para que puedan ser ocupadas tambin por otras clases definidas fuera del paquete escritorio, es necesario incluir el especificador de acceso public en la definicin, como se muestra a continuacin:
// Archivo fuente Lapiz.java package escritorio;

40 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile


public class Lapiz { // Miembros de la clase Lapiz } // Archivo fuente Goma.java package escritorio; public class Goma { // Miembros de la clase Goma } // Archivo fuente Regla.java package escritorio; public class Regla { // Miembros de la clase Regla }

Lenguajes y paradigmas de programacin

3.4 CONCEPTOS OBJETOS


3.4.1

DE

LA

PROGRAMACIN

ORIENTADA

ABSTRACCIN

La abstraccin es el proceso de capturar los aspectos fundamentales de un objeto e ignorar los detalles. Esto proporciona un mecanismo crucial para que las personas puedan comprender, razonar y comunicar sistemas complejos. Sin abstraccin, el nivel de detalle requerido para comprender un sistema hace las personas sean incapaces de construir sus modelos mentales de cmo se estructura un sistema y cmo funciona. En consecuencia, la abstraccin entraa la descomposicin de un sistema complejo en sus partes ms fundamentales y la descripcin de estas partes con un lenguaje sencillo y preciso. Para ejemplificar lo anterior de forma ms clara, una persona entiende un automvil como un todo, sin preocuparse, por ejemplo, de cmo funciona el motor. O bien puede conducir el vehculo sin tener en cuenta cmo se construyen las calles. Un excelente mtodo para gestionar la abstraccin es por medio de clasificaciones jerrquicas. Esto permite descomponer un sistema en partes ms pequeas, significativas y fciles de entender. En otras palabras, se busca dividir el sistema en partes fundamentales que se puedan nombrar y sea posible describir sus funcionalidades. En Java, la abstraccin se logra mediante la creacin de tipos de datos abstractos, que son los objetos implementados por medio de clases. En este mbito, la palabra reservada abstract facilita la abstraccin. Si se aplica esta palabra en la definicin de una clase, se obtiene una clase para la que no se pueden crear objetos, pero que rene caractersticas comunes para varias otras clases. Por ejemplo, se 41 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

puede tener una clase abstracta persona, y otras clases concretas que tienen todas sus caractersticas, por ejemplo: alumno, profesor. Tambin los mtodos de una clase pueden ser abstractos. Esto quiere decir que no se implementan realmente, sino que su implementacin se realiza en clases derivadas. Esto quedar ms claro una vez que se estudie la herencia. Algunas observaciones importantes con respecto a las clases abstractas son: Una clase abstracta se declara con la palabra reservada abstract como prefijo de su encabezado. Una clase con al menos un mtodo abstracto es abstracta y debe ser declarada como tal. Una clase derivada que no redefine un mtodo abstracto es tambin abstracta. Una clase abstracta puede tener atributos y mtodos no abstractos. No es posible crear objetos de clases abstractas. Ejemplo:
import java.math.*; abstract class Figura { public abstract double calcularArea(); } Class Circulo extends Figura { double radio; public double calcularArea() { return (PI * this.radio * this.radio); } }

Observacin: La palabra reservada extends indica herencia, que se estudia en la seccin 3.4.3.
/* La siguiente sentencia produce error porque no es posible crear instancias de clases abstractas. */ Figura cuadrado = new Figura();

3.4.2

ENCAPSULACIN

Consiste en separar los aspectos externos del objeto (las partes a las que pueden acceder otros objetos) de los detalles de implementacin internos (ocultos a otros objetos).En trminos simples, esto significa que lo que hay en el interior de la clase est oculto para el usuario, quien solo tiene acceso a las interfaces.

42 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

La encapsulacin se utiliza para esconder detalles de implementacin. De este modo, dichos detalles pueden cambiar sin afectar otras partes del programa. La nica restriccin es que se debe mantener la interfaz externa. Con la encapsulacin se logra: Modularidad: un trozo de cdigo puede ser escrito y mantenido independientemente del cdigo de otras clases. Ocultamiento de informacin: un objeto posee una interfaz pblica que otros objetos pueden utilizar para comunicarse con l, pero el objeto puede mantener informacin y mtodos privados, que pueden ser cambiados en cualquier momento sin afectar a otros objetos. Las palabras reservadas de Java que permiten manejar la encapsulacin son private, protected y public. Todos aquellos atributos o mtodos que sean declarados como pblicos pueden ser vistos por otros objetos, no as los atributos y mtodos privados y protegidos. Los elementos protegidos pueden ser vistos nicamente por miembros que pertenezcan al mismo paquete. Los privados, en cambio, solo pueden ser vistos por miembros de la misma clase. Ejemplo:
public class private private private public public public public Estudiante { long matricula; String nombre; int edad; Estudiante {} // Constructor long getMatricula() {} String getNombre() {} int getEdad() {}

En el ejemplo no es posible ver directamente los atributos de un objeto, pues stos son privados. Solo se puede acceder a ellos mediante la interfaz definida por los mtodos. 3.4.3 HERENCIA

Mecanismo que permite la definicin de una clase a partir de la definicin de otra ya existente. La herencia permite compartir mtodos y datos entre clases y subclases. Por ejemplo, si se tienen las clases Animal y Perro, esta ltima contiene todas las caractersticas y mtodos de Animal y adems incorpora nuevos elementos. En consecuencia, la herencia es quien proporciona las facilidades de reutilizacin de cdigo en programacin orientada a objetos. El concepto de herencia trae como consecuencia una estructura jerrquica de clases, tambin llamada estructura de rbol. Considrese el ejemplo de la figura 3.2, donde cada rectngulo corresponde a una clase y las lneas que los unen indican herencia. Ah se puede ver Las clases Insecto, Mamfero y Pjaro heredan todos los atributos y mtodos de la clase 43 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Animal. A su vez, Persona hereda todas las caractersticas de Mamfero (y, en consecuencia, de Animal). Finalmente, las clases Hombre y Mujer heredan de la clase Persona.

Figura 3.2: rbol de jerarqua de clases Otra caracterstica importante de la herencia es que puede ser simple (solo una clase padre) o mltiple (dos o ms clases padre). En la figura 3.2 solo se pueden apreciar casos de herencia simple. La figura 3.3, en cambio, muestra un ejemplo de herencia mltiple.

Figura 3.3: Un ejemplo de herencia mltiple El lenguaje Java solo permite herencia simple. Esto quiere decir que cada clase puede tener solo una clase padre. Algunas definiciones importantes son: Superclase: es una clase padre. En la figura 3.2, Mamfero es una superclase de Persona. Cabe destacar que una superclase puede tener mltiples subclases. Subclase: es una clase hija. En la figura 3.2, Mujer es una subclase de Persona. Clase raz (clase base): es una clase que no tiene padres. En la figura 3.2 solo Animal es una clase raz. Clase hoja: es aquella que no tiene subclases (Insecto, Mujer, Hombre y Pjaro en la figura 3.2).

44 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Una caracterstica fundamental de la herencia es que una subclase no est limitada al uso y comportamiento que hereda de su superclase. As, una subclase puede incorporar nuevos atributos y mtodos, e incluso puede anular mtodos heredados proporcionando nuevas implementaciones ms especficas. En Java, para indicar que una clase hereda de otra se usa la palabra reservada extends. Ejemplo:
package herencia; public class private private private Persona { String nombre, apellido; char genero; int agnoNacimiento;

public String getNombre() { return this.nombre; } public String getApellido() { return this.apellido; } public char getGenero() { return this.genero; } public int getAgno() { return this.agnoNacimiento; } public void setNombre(String n) { this.nombre = n; } public void setApellido(String a) { this.apellido = a; } public void setGenero(char g) { this.genero = g; } public void setAgno(int a) { this.agnoNacimiento = a; } public void mostrar() { System.out.println(this.getNombre() + " " + this.getApellido()); }

La clase persona posee la subclase alumno: 45 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

package herencia; public class Alumno extends Persona { private long matricula; private int nivel; public long getMatricula() { return this.matricula; } public int getNivel() { return this.nivel; } public void setMatricula(long m) { this.matricula = m; } public void setNivel(int n) { this.nivel = n; } public void mostrar() { System.out.println(this.getNombre() + " " + this.getApellido() + " " + this.getMatricula()); } }

Main:
package herencia; public class Main { public static void main(String[] args) { Persona p[] = new Persona [10]; Persona alguien = new Persona(); alguien.setNombre("Francisca"); alguien.setApellido("Aravena"); alguien.setGenero('f'); alguien.setAgno(1980); Alumno pepito = new Alumno(); pepito.setNombre("Jose"); pepito.setApellido("Puchalt"); pepito.setGenero('m'); pepito.setAgno(1985); pepito.setMatricula(62903827); pepito.setNivel(3); p[0] = alguien; p[1] = pepito; for(int i = 0; i < 2; i++)

46 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile


p[i].mostrar();

Lenguajes y paradigmas de programacin

} }

Es importante mencionar que en ocasiones puede ser til impedir que una clase pueda poseer subclases. Para este fin se usa la palabra reservada final en su declaracin:
public final class Estudiante {}

3.4.4

POLIMORFISMO

La palabra polimorfismo, de origen griego, significa muchas formas. Esta caracterstica propia de la orientacin a objetos permite que se pueda enviar un mismo mensaje a objetos de clases diferentes, pero que cada objeto responda a dicho mensaje de acuerdo a su implementacin. Es importante destacar que el polimorfismo solo se aplica a mtodos con igual signatura (nombre, cantidad y tipo de parmetros) pero definidos en clases diferentes. Por ejemplo, el mtodo void mostrar() de las clases Persona y Alumno implementadas en 3.4.3 es polimrfico, pues su definicin es la misma en ambas clases pero su implementacin es diferente. 3.4.5 SOBRECARGA DE MTODOS Y CONSTRUCTORES

La identificacin de un mtodo corresponde a la combinacin del tipo de dato que regresa, su nombre y los parmetros que recibe. La sobrecarga de mtodos es la creacin, en una misma clase, de varios mtodos con el mismo nombre pero con diferente nmero o tipo de argumentos. Esto es vlido para cualquier mtodo, incluso para constructores. La siguiente implementacin de la clase Persona posee sobrecarga del constructor.
public class private private private private Persona { String rut; String nombre; String apellido; long telefono;

public Persona() { } public Persona(String rut) { this.setRut(rut); } public Persona(String rut, String apellido) { this.setRut(rut); this.setApellido(apellido);

47 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile


}

Lenguajes y paradigmas de programacin

public Persona(String nombre, long telefono) { this.setNombre(nombre); this.setTelefono(telefono); } public void mostrar() { System.out.println("RUT: " + this.getRut() + " Nombre: " + this.getNombre() + " Apellido: " + this.getApellido() + " Telefono: " + this.getTelefono()); } public void setRut(String r) { this.rut = r; } public void setNombre(String n) { this.nombre = n; } public void setApellido(String a) { this.apellido = a; } public void setTelefono(long t) { this.telefono = t; } public String getRut() { return this.rut; } public String getNombre() { return this.nombre; } public String getApellido() { return this.apellido; } public long getTelefono() { return this.telefono; } public static void main(String[] args) { Persona P1 = new Persona(); Persona P2 = new Persona("13.672.509-2"); Persona P3 = new Persona("5.317.503-1", "Guzman"); Persona P4 = new Persona("Carolina", 6347088); P1.mostrar(); P2.mostrar(); P3.mostrar(); P4.mostrar();

} }

48 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

La ejecucin del programa arroja el siguiente resultado:


RUT: RUT: RUT: RUT: null Nombre: null Apellido: null Telefono: 0 13.672.509-2 Nombre: null Apellido: null Telefono: 0 5.317.503-1 Nombre: null Apellido: Guzman Telefono: 0 null Nombre: Carolina Apellido: null Telefono: 6347088

3.5 MS SOBRE JAVA


3.5.1 INTERFACES

Una construccin muy til de Java es la interfaz, que permite declarar un conjunto de constantes y encabezados abstractos de funciones, que debern implementarse posteriormente en las clases que hagan uso de la interfaz. Todo mtodo de una interfaz es pblico y abstracto y todo atributo es pblico y constante, por lo que no est permitido preceder la declaracin de atributos y mtodos con modificadores. La creacin de una interfaz es similar a la de una clase, excepto porque se reemplaza la palabra class por interface y porque una interfaz siempre ser pblica. Suponga, por ejemplo, que por ley todos los barcos deben contar con una alarma y con un medio para enviar mensajes de socorro en caso de emergencia. Sera til entonces contar con una interfaz comn, independientemente de la implementacin que se haga en cada barco:
public interface Barco { void alarma(); void mensajeSocorro(String mensaje) }

Se dice que una clase que usa una interfaz la implementa, lo que se seala mediante la palabra reservada implements. Como se seal anteriormente, los mtodos de una interfaz son abstractos, por lo que pueden tener mltiples implementaciones diferentes. Un ejemplo de esto ltimo se puede ver en las clases Crucero, Portaaviones y Pesquero:
class Crucero implements Barco { private int eslora; private int pasajeros; public Crucero() { System.out.printl(Crucero creado.); } public void alarma() { System.out.println(Alarma del crucero!!!);

49 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile


}

Lenguajes y paradigmas de programacin

Public void mensajeSocorro(String mensaje) { this.alarma(); System.out.println(SOS! SOS! + mensaje); } }

class Portaaviones implements Barco { private int aviones = 19; private int tripulacion; public Portaaviones(int marinos) { tripulacion = marinos; System.out.println(Portaaviones creado.); } public void alarma() { System.out.println(Marineros, a sus puestos!!!); } Public void mensajeSocorro(String mensaje) { System.out.println(SOS! SOS! + mensaje); } }

class Pesquero implements Barco { private int eslora; private double potencia; private int pescadores; String nombre; public Pesquero(String nom) { nombre = nom; System.out.println(Pesquero + nombre + creado.); } public void alarma() { System.out.println(Alarma desde el pesquero + nombre + !); } Public void mensajeSocorro(String mensaje) { System.out.println(SOS! SOS! + mensaje); }

3.5.2

OTROS USOS PARA LA PALABRA RESERVADA final

Se vio anteriormente que una clase declarada como final no puede ser derivada. No obstante, este modificador tiene adems otros usos, segn si se aplica a atributos o mtodos: 50 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Un atributo declarado como final es una constante. Es decir, una variable que se inicializa con un valor al momento de su declaracin, y que no puede ser modificado posteriormente. Un mtodo definido como final no puede ser redefinido en subclases que hereden de la clase en que ha sido definido. La palabra reservada final permite adems crear constantes de forma similar a la directiva #define de C/C++: final int MAX = 9432; final char ARROBA = @; final String STR = Hola mundo!

3.6 UML: UN LENGUAJE PARA MODELAR APLICACIONES CONSTRUIDAS CON ORIENTACIN A OBJETOS
3.6.1 QU ES UML?

UML, el lenguaje unificado de modelado, es un lenguaje o conjunto de herramientas que permite modelar (es decir, analizar y disear) sistemas orientados a objetos. Es un lenguaje complejo y extenso, lo que se ve reflejado en la popular aseveracin: el 80% de los problemas se pueden resolver usando solo el 20% de UML. En consecuencia, aqu solo se aborda una pequea porcin de esta muy til herramienta. 3.6.2 CLASES

Una clase, como ya se ha discutido en este captulo, es la unidad bsica que encapsula toda la informacin de un objeto y un objeto es una instancia de una clase. En UML, una clase es representada por un rectngulo que posee tres divisiones horizontales: Superior: contiene el nombre de la clase. Intermedio: contiene los atributos de la clase. Inferior: contiene los mtodos de la clase.

Lo anterior se ilustra grficamente en la figura 3.4. Ahora bien, muchas veces resulta muy til conocer la visibilidad de los atributos y mtodos de una clase. As, en la representacin de una clase se seala que un atributo o mtodo es

51 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

pblico precedindolo por el signo +; que es privado, con un signo -, y que es protegido (visible por la clase o por clases que heredan de ella) con un signo #.

Figura 3.4: Esquema de representacin de una clase con UML Ejemplo: Considere que una cuenta corriente tiene como atributos su nmero, el nombre del cliente, el saldo y un ejecutivo de cuenta. Adems, tiene las operaciones de depsito, giro, consulta de saldo y cambio de ejecutivo. Esta ltima, no obstante, es de uso restringido por parte del banco.

Figura 3.5: La clase Cuenta representada con UML Una observacin importante es que las clases abstractas se distinguen escribiendo su nombre con letra cursiva. Lo mismo ocurre con los mtodos abstractos. 3.6.3 RELACIONES ENTRE CLASES

Una vez vista la representacin de una clase, es necesario explicar cmo se relacionan dos o ms clases entre ellas. 3.6.3.1 Herencia

52 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

La herencia es la forma en que una clase puede conservar los atributos y mtodos de otra, adems de incorporar elementos nuevos. Con UML, la herencia se representa como un tringulo con un vrtice apoyado en la clase padre y una lnea que sale desde la arista opuesta del tringulo hacia la clase hija, como se observa en la figura 3.6. En ella, tanto Automvil como Camioneta heredan de Vehculo.

Figura 3.6: Notacin en UML para la herencia 3.6.3.2 Agregacin y composicin Muchas veces los tipos de datos bsicos proporcionados por el lenguaje de programacin son insuficientes para modelar objetos ms complejos. Muchas veces, un objeto puede tener como atributo a un objeto de otra clase. Esto puede hacerse de dos formas: mediante composicin y por medio de la agregacin: Composicin: es una relacin esttica y el objeto contenido forma parte del objeto que lo incorpora. Esto hace que el tiempo de vida del primero est condicionado por el tiempo de vida del segundo.

53 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Agregacin: la relacin es dinmica (punteros), por lo que en este caso el tiempo de vida del objeto incorporado no depende del tiempo de vida del objeto que lo incluye. La idea es que el objeto base solo utiliza al objeto agregado para su funcionamiento.

Ambas operaciones se representan por medio de rombos que nacen en la clase base y de los que parten lneas hacia la clase del objeto incluido. La composicin se representa con un rombo negro, mientras la agregacin se seala por medio de un rombo blanco. La figura 3.7 ejemplifica lo anterior. Un almacn posee clientes y cuentas. Si el almacn desaparece (composicin), tambin lo harn las cuentas. Los clientes, en cambio, siguen existiendo (agregacin).

Figura 3.7: Notacin en UML para la composicin y la agregacin 3.6.3.3 Asociacin La asociacin permite reunir objetos que colaboran entre s. El tiempo de vida de cada objeto es independiente del tiempo de vida de los dems. La asociacin se representa mediante una flecha que en cada extremo indica la cardinalidad (cantidad de objetos de esa clase que puede haber): Cantidad fija: n Cero o muchos: 0..* Uno o muchos: 1..* Cero o uno: 0..1 54 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

La figura 3.8 muestra la asociacin entre clientes y rdenes de compra. Un cliente puede o no emitir rdenes de compra, pero la orden de compra debe ser emitida por un nico cliente.

Figura 3.8: Asociacin representada con UML 3.6.4 DIAGRAMA DE CLASES

Un diagrama de clases sirve para visualizar las relaciones entre las clases que conforman el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contencin. En consecuencia, un diagrama de clases esta compuesto por los siguientes elementos: Clases: con sus atributos, mtodos y visibilidad. Relaciones entre clases: las clases interactan entre ellas por medio de las relaciones ya vistas: herencia, composicin, agregacin, asociacin y uso.

Ejemplo: Modelar una parte de la funcionalidad recogida en un sistema que gestiona una liga de bsquetbol. Los requisitos del sistema son: Se debe precisa conocer a todos los equipos que integran la liga de bsquetbol. Cada equipo cuenta con entre 5 y 15 jugadores, que tienen una relacin contractual y slo pueden haber sido contratados por un equipo. Un equipo tiene siempre un pabelln como nica sede, donde jugar sus partidos como local, y siempre tendr al menos un pabelln alternativo para jugar los partidos en los que tenga clausurada su sede principal. Un pabelln puede ser sede principal compartida por varios equipos. La competicin en forma de liguilla es conocida: todos los equipos juegan dos partidos contra los dems (uno como local y otro como visitante). Cada partido es dirigido por tres rbitros. En el partido participan de 5 a 12 jugadores por cada equipo, registrndose para cada uno de ellos las estadsticas conseguidas. 55 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

En un partido pueden ocurrir faltas que pueden involucrar tanto a jugadores como al equipo que juega como local. stas son exclusivas de un nico partido. Eventualmente, pueden ser castigadas con una sancin, que tambin es exclusiva. La clausura de una sede es una sancin que afecta al equipo. Un pabelln puede sufrir varias clausuras durante la liga. Interesa conocer: El nombre y la ciudad de cada equipo. El RUT, el nombre y el contrato de cada jugador. El nmero de espectadores y el resultado de un partido. El nombre y el colegio de un rbitro. Una descripcin de las faltas. Una descripcin de la sancin y su duracin (cantidad de partidos) En cada partido se debe llevar un registro de las estadsticas de los jugadores. Se deben conocer las estadsticas de los partidos (obtenidas a partir de las estadsticas de cada jugador y el resultado final). Se debe conocer la clasificacin cada equipo (obtenida a partir de las estadsticas de cada partido jugado por el equipo). Se requiere saber si un jugador est sancionado. Es necesario saber si un pabelln est clausurado.

56 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

3.7 EVALUACIN DEL PARADIGMA ORIENTADO A OBJETOS: VENTAJAS Y DESVENTAJAS


Existen muchas ventajas del paradigma orientado a objetos en contraste con otros mtodos de desarrollo: Los modelos orientados a objetos apelan al funcionamiento de la cognicin humana, por lo que la tarea humana en el desarrollo de un sistema es ms natural y menos propensa a los errores. Fomenta la reutilizacin de mdulos y diseos completos (o al menos de grandes porciones de diseos). En particular, permite la construccin de una jerarqua de clases (biblioteca) a partir de la cual todas las clases requeridas en una nueva aplicacin pueden ser construidas por medio de herencia o composicin. Los sistemas orientados a objetos tienden a estar basados en formas estables (objetos y clases) que son ms dados a evolucionar en el tiempo ms que tener que abandonarlos o redisearlos completamente. La representacin de objetos y la encapsulacin conducen a la obtencin de software altamente cohesivo y dbilmente acoplado, lo que lo vuelve fcil de modificar: se puede alterar una clase sin necesidad de efectuar cambios en otras partes del sistema.

Algunas desventajas de la programacin orientada a objetos son: Desempeo reducido del software, debido a que muchos lenguajes orientados a objetos son interpretados en lugar de compilados, y tambin por los problemas de asignacin dinmica de memoria. Se requiere un mayor tiempo inicial de desarrollo. Menor reutilizacin de cdigo que la esperada, pues con la herencia se tiene que el cdigo de un objeto est disperso por la jerarqua de clases y no en un nico lugar.

3.8 EJERCICIOS
1. Construya una clase en java que implemente vectores de tres dimensiones, con las operaciones de suma, resta, producto punto y producto cruz. Adems, debe proporcionar un constructor que entregue el vector sin sus valores y otro que cree un 57 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

vector con sus valores ya establecidos. Implemente adems un mtodo main que permita probar el correcto funcionamiento de los mtodos. 2. Construya una clase en java que implemente fechas. Debe adems permitir comprobar que las fechas sean vlidas, considerando aos bisiestos. Adems del constructor, los setters y getters, implemente mtodos que permitan ver si un ao es bisiesto y mostrar la fecha como un string. Indicacin: los aos bisiestos son aquellos cuyo nmero es divisible por 4, excepto aquellos que sean divisibles por 100, salvo que estos ltimos sean divisibles por 400. Por ejemplo, son bisiestos 2008, 1996, 1600. No son bisiestos 2007, 1900. 3. Construya una clase en Java que permita construir RUTs e indique si algn RUT es incorrecto. Para este fin, considere los RUTS como un entero y un carcter correspondiente al dgito verificador. Implemente adems un mtodo que permita representar el RUT como un string con el formato habitual: dd.ddd.ddd-v. Indicacin: el algoritmo que se utiliza para calcular el dgito verificador es el siguiente: 4. Construya las clases Persona, Profesor y Alumno. Las dos ltimas heredan de la clase Persona. Considere que cada persona tiene nombres, apellidos paterno y materno, RUT (use la clase construida en el ejercicio anterior) y gnero (masculino o femenino). Adicionalmente, los profesores tienen un rango, representado por un nmero, y pertenecen a un departamento. Los alumnos, por su parte, tienen un nmero de matrcula y pertenecen a una carrera. Para cada persona, debe ser posible crear una nueva persona en blanco, llenar sus datos y mostrarlos por pantalla. Lo mismo ocurre con profesores y alumnos, para los cuales adems debe ser posible convertirlos en una instancia de Persona. Adicionalmente, implemente una clase que permita almacenar listados de personas, profesores y alumnos, adems de un listado que contenga a todos los individuos antes mencionados. Dicha clase debe contar con mtodos para mostrar cada listado ordenado alfabticamente. Muestre un breve programa que ejemplifique el funcionamiento de las clases implementadas. 5. La Universidad del Vago es una nueva institucin de educacin superior que pretende crear dos carreras hasta ahora nunca vistas en este pas: Pedagoga en horas libres y Tecnologa del ocio. Cada una de esas carreras tiene una cierta duracin, una cantidad fija de asignaturas y cantidad de cupos por ao. A su vez, existen asignaturas que forman parte de la malla curricular de ambas carreras. Cada asignatura es impartida por un profesor y puede tener muchos alumnos inscritos. Cada profesor puede impartir entre una y cuatro asignaturas, mientras que cada alumno puede cursar entre una y seis asignaturas. 58 Profesora: Jacqueline Khler C.

Universidad de Santiago de Chile

Lenguajes y paradigmas de programacin

Adicionalmente, la Universidad cuenta con personal administrativo que da soporte a acadmicos y alumnos. Considere que acadmicos, alumnos y funcionarios comparten diversas caractersticas, al ser todos ellos personas. Construya el diagrama de clases para el problema planteado, sin considerar atributos ni mtodos de las clases.

59 Profesora: Jacqueline Khler C.

Vous aimerez peut-être aussi