Está en la página 1de 95

CONSULTORES EDITORIALES

AREA D E I N F O R M A T I C A Y C O M P U T A C I O N
Antonio Vaquero Snchez
Catedrtico de Lenguajes y Sistemas Informticos
Escuela Superior de Informtica
Universidad Complutense de Madrid
ESPANA
Gerardo Quiroz Vieyra
Ingeniero en Coinunicaciones y Electrnica
por la ESIME del Instituto Politcnico Nacional
Profesor de la Universidad Autnoma Metropolitana
Unidad Xochimilco
MEXICO
Willy Vega Glvez
Universidad Nacional de Ingeniera
PERU

PROGRAMACION
ORIENTADA A OBJETOS
Luis Joyanes Aguilar
Director del Departamento de
Lenguajes y Sistemas Informticos e Ingeniera de Software
Facultad de Informtica
Universidad Pontificia de Salamanca Cainpus Madiid

McGraw-Hill

MADRID. BUENOS AIRES. CARACAS GUATEMALA LISBOA MEXICO


NUEVA YORK PANAMA. SAN JUAN SANTAFE DE BOGOTA SANTIAGO. SAO PAULO
AUCKLAND HAMBURGO LONDRES MllAN MONTREAL NUEVA DELHl PARIS
SAN FRANCISCO. SIDNEY SINGAPUR ST LOUlS TOKIO TORONTO

Prlogo
Parte 1
EL MUNDO DE LA ORIENTACION A OBJETOS:
CONCEPTOS, RELACIONES, MODELADO Y LENGUAJES
DE PROGRAMACION
Captulo 1. El desarrollo de software
11

12
13
PROGRAMACION ORIENIADA A 0B.JEIOS
No est permitida la reproduccin total o parcial de este libro, ni su tratamiento
informtica, ni la transmisin de ninguna forma o por cualquier medio, ya sea
electrnico, mecnico, por fotocopia, por registro u otros metodos, sin el permiso
previo y por escrito de los titulares del Copyright

14
15

a
en espaol, por
DERECHOS RESERVADOS 01996, respecto a la p r i ~ edicin
McGRAW-HILL/INTERAMERICANADE ESPANA, S A
Edificio Valrealty, 1 " planta
Basauri, 17
28023 Aravaca (Madrid)

16
17

ISBN: 84-481-0590-'7
Depsito legal: M 30 121-1996

Editor: Jos Dominguez Alconchel


Diseo de cubierta: Juan Garcia
Compuesto e impreso en Fernndez Ciudad, S I

18
19

L.a complejidad inbeiente al software


1 1 1 La complejidad del dominio del problema
..
1 1 2 L a dificultad de gestionar el proceso de desarrollo
1 1 3 L a flexibilidad a travs del software
La crisis del softwate . .
Factores en la calidad del software
. .
1 1 1 Razones fundamentales que estn influyendo en la imwortancia de
la P O 0
Proeramacin v abstraccin
El papel (el rolj de la abstraccin
1 5 1 La abstraccin como proceso natural mental
1 5 2 Historia de la abstraccin del software
1 5 3 Procedimientos
.,
1 5 4 Mdulos , ,
1 5 5. Tipos abstractos de datos
1.5 6 Objetos
U n nuevo paradigma de programacin
Orientacin a objetos
1 7 1 Abstraccin
, ,
1 7 2 Encapsulacin
1 7 3 Modularidad
1'7 4 Jerarqua
1 7 5 Polimorfismo
1 7 6 Otras propiedades
Reutilizacin de software
,
.
, ,
Lenguajes de programacin orientados a objetos
1 9 1 Clasificacin de los lenguajes orientados a objetos

xvii

vi

1 10 Desarrollo tiadicioiial frente a oiientado a objetos


1 11 Beneficios de las tecnologas de objetos (TO)
Resumen

Captulo 2

Modularidad
2 1 1 L.a estiuctura de un mdulo
2.1 2 Reglas de modularizacin
2 2 Diseno de mdulos
2 2 1 Acoplamieiito de mdulos
2.2 2 Cohesin de mdulos
2 3 Tipos de daios
2 4 Abstiaccin en lenguajes de progiaiiidcin
2 4 1 Abstracciones de control
2.4 2 Abstracciii de datos
2 5 Tipos abstiactos de datos
2 5 1 Veritajas de los tipos abstI%dctosde daios
2.5 2 Iinplementacin de los TAD . .
. ,
2 6 Tipos abstractos de datos en 'Turbo Pascal
2.6 1 Aplicaciii del tipo abstiacto de dato Pila
2 7 Tipos abstiactos de datos en Modula-2
2 7 1 Mdulos
2 '7 2 Mdulos locales
2
Tinos onacos
- 7 1
2 7 4 Tipos transpdientes
.,
2 7 5 Una versin del tipo abstracto de dato Pila con datos opacos
7 7. 6. Otra
aolicaciii del TAD Pila
-.
.
2 8 Tipos abstractos de datos en Ada
2 8 1 Tipos piiuados
2.8 2 Tipos privados limitados
2 9 Tipos abstractos de datos en C .
2.9 1 Un ejemplo de un tipo abstracto de datos en C
..
2 10 Tipos abstractos de datos en C + +
2 10 1 Definicin de una clase Pila en C + +
Resumen
Ejercicios
~

~~

Captulo 3

12

33
34

25
27
29

Modularidad: tipos abstractos de datos

21

31

Contenido

Contenido

Conceptos fundamentales de programacin orientada a objetos

Piograiiiacin estructuiada
3 1 1 Desventajas de la piogramacin estructuiada
&QuCes la piogramacin otientada a objetos"
3 2 1 El objeto
3 2 2 Ejemplos de objetos
3 2 3 Mtodos y mensajes
Clases
3 3 1 Irnplementacin de clases en lenguajes
3 3 2 Sintaxis
Un mundo de objetos

31
31
32
35
35
35
36
38
38
19

.-

3 4 1 Definicin de objetos
3 4 2 Identificacin de objetos
3 4 3 Duracin de los objetos .
..
3 4 4 Objetos frente a clases Representacin gifica (Notacin de Ege)
3 4 5 Datos internos
3.4 6 Ocultacin de datos
3 5 Herencia
3 5 1 Sintaxis
3.5 2 Tipos de herencia
.
3 6 Comunicaciones eiitie objetos: los mensajes
3 6 1 Activacin de objetos
3 6 2 Mensajes
.
3 6 3 Paso de mensajes
3 7 Estiuctura interna de un objeto
3 7 1 Atributos
3.7.2 Mtodos
3 8 Clases . .
3.8 1 Una comparacin con tablas de datos
3 9 Herencia y tipos
3 9 1 Herencia simple (he?eiicia ,jerdrquica)
3 9 2 Herencia mltiple (Iierei~iaeii malla)
3 9 3 Clases abstractas
3 10 Anulacin/Sustitucin
3 11 Sobrecarga
3 12 Ligadura dinmica
3 12 1 Funciones o mtodos viituales
3.12 2 Polimorfismo
3 13 Objetos compuestos
3 13 1 Un ejemplo de objetos compuestos
3 13 2 Niveles de prolundidad
3 14 Reutilizacin con orientacin a objetos
3 14 1 Objetos y ieutilizaciii
3 15 Polimorfisino
Resumen

Captulo 4. Lenguajes de programacin orientados a objetos


41
42

43

Evolucin de los LPOOS


. .
4 1 1 Estado actual de los leiiguajes orientados a objetos en la dcada de
los noventa
Clasilicaciii de lenguajes orientados a objetos .
4 2 1 Taxonoma de lenguajes orieiitados a objetos .
4 2 2 Caractersticas de los lenguajes oiientddos a objetos
. .
4 2 3 Puros frente a hbridos
4 2 4 Tipificacin esttica freiite a diiimica
4 2 5 Ligadura esttica frente a dinmica
4 2 6 Revisin de lenguajes orientados a objetos
Ada
, .
. .
4 3 1 Abstraccin de datos en Ada
4 3 2 Genericidad eii Ada
..
4 3 3 Sopoite de herencia en Ada-83
4 3 4 Soporte Ada para orientacin a objetos

vii

Contenido

67

Diseos prcticos de clases


6.'7 1 Clases Reloj y Pre,seiltal .
6 8 Tcnicas de creacin e inicializacin de objetos
6 8 1 Objetos dinmicos neiv y delete
6 9 Inicializacin y limpieza de objetos
6 9 1 Uso de una clase
, .
. .
6 10 Reglas prcticas para construccin de clases
6 10 1 Funciones miembro .
6 10 2 Una aplicacin sencilla
6 10 3 Control de acceso a los miembros de una clase
610 4 Creacin, inicializacin y destruccin de objetos
6 11 El puntero this
Resumen
Ejercicios

Eiffel .
, . .
..
4 4 1 La biblioteca de clases Eiffel . . .
4 4 2 El entorno de programacin Eiffel
4 4 3. El lenguaje Eif'fel
4 5 Smalltalk
. ., ,
4 5 1 El lenguaje Smalltalk . , . .
4.52 La jerarqua de clases Smallialk
..
4 6 Otros lenguajes de programacin orientados a objetos
Resumen
Ejercicios

44

Captulo S. Modelado de objetos: relaciones


Relaciones entre clases . .
, .
.. .
Relacin de generalizacin/especializacin(is-des-un)
52.1 Ierarquas de generalizacin/especializacin
5 3 Relacin de agregacin (has-a/tiene-un)
5 3.1 Agregacin frente a generalizacin
5 4 Relacin de asociaciii
5.4 1 Otros ejemplos de cardinalidad
5 5 Herencia: jerarqua de clases
5 5 1 Herencia simple
5 5 2 Herencia mltiple .
,
,
5 5 2 1 Ventajas de la herencia mltiple
5 5 2 2 Inconvenientes de la herencia mltiple
5 5 2 3 Diseo de clases con herencia mltiple
5 6 Herencia repetida
Resumen
Ejercicios

51
52

Captulo 7. Clases abstractas y herencia


71
72
'7 3

Abstraccin de la geneializacin y especializacin de clases


Clases abstractas
. ,. ,
Herencia en C++: clases derivadas
7 3 1 Sintaxis de la herencia simple
7 3 2 Sintaxis de la herencia mltiple
7.3 3 Ambigedad y resolucin de mbito
7 4 Herencia repetida y clases base virtuales
7 5 Funciones virtuales puras
.,
7.5 1 Otro ejemplo de clase abstracta
'7 6 Diseo de clases abstractas
7 7 Una aplicacin prctica: jerarqua de figuras
7 7 1 La clase Figura
Resumen
Ejercicios

Parte 11
PROGRAMACION ORIENTADA A OBJEIOS CON C + +

Captulo 8 . Polimorfismo

61
62
63
64
65
66

Clases y objetos en C + +

Clases y objetos
Objetos
.
6.2 1 Identificacin de objetos
Clases
Creacin de clases
Diagramas de clases y objetos
Construccin de clases en C + +
6 6 1 Declaracin de clases
6 6 2 Definicin de una clase
6 6 3 Constructores y destructores
6 6 4 Usar las clases
6 6 5 Especificacin/implementacin de clases
6 6 6 Compilaciii separada de clases
6 6 7 Reutilizacin de clases . .
6 6 8 Estilos de declaracin de clases

Captulo 9 . Genericidad: plantillas (templates)


,

L.igadura
..
8.1 1 Ligadura en C++
8 2 Funciones virtuales . .
.
.
8 2.1 Ligadura dinmica mediante funciones virtuales
8 3 Polimorfismo
.
. .
. .
8 3 1 El poliinorfismo sin ligadura dinmica
8 3 2 El polimorfismo con ligadura dinmica
8 4 Uso del polimorfismo .
..
8 4 1 Uso del polimorfiosmo en C + + .
8 5 Ligadura dinmica freiite a ligadura esttica
8 6 Ventajas del polimorfismo
Resumen
Ejercicios
81

Captulo 6

91
92

Genericidad
Conceptos fundamentales de plantillas en C++

Contenido

Contenido

11 5

Plantillas de funciones
.
9 3 1 Fundaineiitos tericos
9 3 2 Definicin de plantilla de funcin
9 3 3, Un ejemplo de plantilla de funciones
9 3 4 Un ejemplo de funcin plantilla
9 3 5 Plantillas de funcin ordeiiar y buscai
9 3 6 Una aplicacin prctica
9 3 7 Probleinas en las funcioiies plantilla
9 4 Plantillas de clases
. . .
9 4 1 Definicin de una plaiitilla de clase
9 4 2 Instanciacin de una plantilla de clases
9 4 3 Utilizacin de uiia plantilla de clase
9 4 4 Argumentos de plantillas . .
9.4 5 Aplicaciones de plantillas de clases
9 5 Una plantilla para manejo de pilas de datos
9 5 1 Definicin de las funciones mieinbro
9 5 2 Utilizacin de una clase plantilla
9 5 3 Instanciacin de una clase plantilla con clases
9 5 4 Uso de las plantillas de funcioiies con clases
9 6 Plantillas frente a polimorfismo
Resumen
Ejercicios

Parte 111
DISENO ORIENTADO A OBJETOS
Captulo 1 2 Diseo orientado a objetos (Notaciones Booch, Rumbaugli
, , , ,
335
y CoadlYonrdon) . , , , . , . . , , . . , . . . . . . , , . , . . . . . .

10 1
10 2

Concepto de excepciii
Manejo de excepciones
10 2 1 Medios tpicos pala el manejo de excepciones
10 3 El mecanismo de excepciones en C + +
10 4 L.anzamiento de excepciones
1 0 4 1 Foiinatos de thiow
10 5 Manejadores de excepciones
10 5 1 Bloques 1rj)
10 5 2 Captura de excepciones
10 5 3 Relanzamiento de excepciones
10 6 Especificacin de excepciones
10 7 Aplicaciones prcticas de manejo de excepciones
, .
10 7 1 Calculai las races de uiia ecuacin de segundo grado
10 7 2 Control de excepciones en una estructura tipo pila
Resuineu
Ejercicios

Captulo 11.. Reutilizacin de software con C + i

11 2
11 3
11 4

Mecanismos de reutilizacin
11 1 1 Herramientas tradicionales de reutilizacin
Reutilizacin por herencia .
.
11 2 1 Ventajas de la reutilizacin a travs de la herencia
Las recompilaciones en C + +
Reutilizacin mediante plantillas o tipos genricos
11 4 1 Polimorfismo frente a geuericidad

Desarrollo de un sistema orientado a objetos


12 1 1 Identifica1 clases y objetos
12 1 2 Asignacin de atributos y coinpoitamiento
12 1 3 Encontiar las ielaciones entre clases y objetos
12 1 4 Interfaz e implementacin de las clases
12 2 Notacioiies grficas
. ..
12 2 1 Notacin de Booch'93
12 2 2 Notaciii de Yourdon
.. . . .
12 2 3 Notacin de Rumbaugh (OMT)
12 3 Implementacin de clases y objetos en C + +
12 3 1 El modificado1 coiist ,
..
12 4 Creacin de funciones mieinbro en C + +
12 4 1 Funcioiies iniiize
.
1 2 4 2 Funciones miembro virtuales y virtuales pulas
e
124.3 Variables miembro y accesibilidad
12 5 Implementacin de relaciones coi1 C + +
12 5 1 Relaciones de generalizacin-especializacin (es-un)
12 5 2 Relacin de agregacin/composicin (tiene-un)
12 5 3 Relacin de asociacin
12 5 4 Relacin utilizu ( u s e s )
12 6 Clases abstractas
, .
126 1 Abstraccin mediante plantillas
12'7 Una aplicacin orieiitada a objetos
12 7 1 Identificar las clases
12 7 2 Identificar relaciones
. .
, ,
12 7 3 Definir el interfaz de cada clase
Resumen
Ejercicios

12 1

Capitulo 10. Excepciones

11 1

321
323
324
325
326
326
327
328
328
329
329
331

Bibliotecas de clases
11 5 1 Coiitenedores
11 5 2 La riecesidad de los coiitenedoies
11 5 3 Clases contenedoias de Boiland C + + 3 1 a 5 0
11 5 4 La biblioteca estndar de plantillas (SIL)
11 6 Clases contenedoras en Boiland C + + 4 515 O
11 6 1 Nombies de las clases contenedoias
11 6 2 Clases vector
11 6 3 Clases listas doblemente enlazadas
11 6 4 Clases array
11 6 5 Creacin y uso de contenedores
Resumen

93

xii

Contenido

Contenido
13 19 Organizacin de un programa C + +
13 19 1 Evitar definiciones mltiples
, . ,
13 19 2 Evitar incluir archivos de cabecera ms de una vez
Resumen
Ejercicios
, , , , , ,

Parte IV
EL LENGUAJE C + + : SINTAXIS, CONSTRUCCION
Y PUESTA A PUNTO DE PROGRAMAS
Captulo 13. De C a C + +
13 1
13 2
13 3
13 4
13 5
13 6

13 7
13 8
13 9
13 10
13 11
13 12
13 13

13 14

13 15
13 16
13 17

13 18

, ,

Limitaciones de C
. .
.,
Mejora de caractersticas de C en C i +
El primer programa C + +
. ..
13 3 1 Comparacin de programas C y C + +
Nuevas palabras reservadas de C + +
Comentarios
Declaraciones de variables , .
.
.
13 6 1 Declaracin de variables en un bucle foi
,
,
,
13 6 2 Declaraciones externas
13 6 3 El mbito de una variable
El especificador de tipos conrt
. ,,
13 7 1 Diferencias entre coiist de C + + y conrt de C
13 '7 2 Las variables voltiles
Especificador de tipo uoid
11 8 1 Punteros void
L.os tipos char
. .
13 9 1 Inicializacin de caracteres
Cadenas
,
,
. ,
Conversin obligatoria de tipos (Castiilg)
,
,,
El especificador de tipo volatile
Estructuras, uniones y enumeraciones
13 13 1 Estructuras y uniones
13 13 2 Uniones annimas
13 13 3 Enumeraciones
, .
13 13.4 Enumeraciones annimas
Funciones en C + +
13 14 1 i?~aii%()
,
,
13 14 2 Prototipos de funciones .
13 143 Una declaracin tpica de funciones y prototipos
13 144 Funciones en lnea
,
,
13 14 5 Ventajas sobre las macros
13 14 6 Argumentos por omisin
. .
.
13 147 Funciones con un nmero variable de parmetros (el parmetro ..) .
.. .
. .. , , , ,
Llamada a funciones C Programas mixtos C/C++
El tipo ieferencia
,
,
Sobrecarga
13 17 1 Sobiecarga de funciones
13 172 Aplicacin de sobrecarga de funciones
13 1'7 3 Sobrecarga de operadores
Asignacin diiimica de memoria
13 18 1 El operador new
13 18 2 El puntero nulo/cero
13 18 3 El operador delete
13 184 Ventajas de nen' y delete
,
,

Captulo 14. Construccin de programas en C + + / C


14 1

Compilacin separada de programas


,
14 1 1 Programas multiarcbivo
14 1 2 Bibliotecas de clases
14 2 Almacenamiento extern y static
142 1 extern
14 2 2 static
143 Estructura de un programa C ,
,
144 Compilacin separada de clases
145 Estructura de un programa C + +
.
14 5 1 Qu son archivos de cabecera?
14 5 2 Inclusin de archivos
146 Programas multiarchivo , ,
14 6 1 Qu se debe poner en un archivo fuente?
14 6 2 Referencias externas
14'7 Construccin de archivos proyecto
147 1 Abrir un proyecto
,
,
14 7 2 Aadir archivos fuente .
..
148 Transporte de aplicaciones desde C a C t +
148 1 Enlace entre programas C y C + +
Resumen
Ejercicios

, ,

Captulo 1 5 Puesta a punto de programas en C++,. Errores de programacin tpicos , , , , , , ,


15 1
15 2
15 3
154
15 5
15 6

15 7
15 8

Depuracin de programas
15 1 1 Errores durante la depuracin
, ,
,
Errores en arrays
Errores en cadenas
. . . . , ., ,
15 3 1 Clculo incorrecto de la longitud de una cadena
,
, ,
,
Errores en comentarios , , ,
Errores en corchetes y llaves
Errores en funciones
, , .,
15 6 1 Pasar un argumento por valor en lugar de por variable
15 6 2 Fallos en el valor de retorno de la funcin , , , ,
15 6 3 No incluir el archivo de cabecera de una funcin en tiempo de
ejecucin
, ,
Errores en macros
. ,
.
,. , ,
,
15 7 1 Omisin de parntesis en los argumentos de macros
15 '7 2 Especificacin no vlida de macros tipo funcin
Errores con operadores .
,
, ,
15 8 1 Mal uso de operadores de incremento (++) y decremento (--)
15 8 2 Confusin de operadores de asignacin
, ,
,
,
15 8 3 Fallos en la precedencia de operadores

xiii

xiv
15 9

15 10
15 11
15 12
15 13

Contenido

Contenido

Errores en punteros
15 9 1 Olvido del operador de direccin (&)
15 9 2 Fallos al inicializar un puntero
15 9 3 Declaracin de un puntero con el tipo incorrecto
Errores en sentencias de seleccin (switcli, if-else)
Errores en separadores
Errores bsicos frecuentes
Eriores en clases
Resumen
Ejercicios

Apndice A

Gua de referencia de sintaxis del lenguaje C + + (Estndar C + + ANSI)


503

A1

Elementos del lenguaje


A 1 1 Caracteres
A 1 2 Comentarios
A 1 3 Identificadores .
A.14 Palabras reservadas
A 2 Tipos de datos . ,
A 2 1 Verificacin de tipos
. .
A 3 Constantes
A 3 1 Declaracin de constantes
A 4 Conversin de tipos
A 5 Declaiacin de variables
A 6 Operadores
A 6 1 Operadores aritmticos
A 6 2 Operadores de asignacin
A 6 3 Operaciones lgicos y relacionales
A 6 4 Operadores de manipulacin de bits
A 6 5 El operador rizeof , . , .
A 6 6 Prioridad y asociatividad de operadores
A 6 7 Sobrecarga de operadores
A 7 Entradas y salidas bsicas
A 7 1 Salida
A'7 2 Entrada
A 7 3 Manipuladores
. .
A 8 Sentencias
A 8 1 Sentencias de declaracin
A 8 2 Sentencias de expresin
A 8 3 Sentencias compuestas
A 9 Sentencias condicionales i j . .
A 9 1 Sentencias ij-else anidadas
, .
A 9 2 Sentencias de alternativa mltiple: sivitch
A 10 Bucles: sentencias repetitivas
A 10 1 Sentencia while
A 10 2 Sentencia do
A 10 3 Sentencia for
A 10 4 Sentencias bieak y coi~tinue
A 10 5 Sentencia nula
A 10 6 Sentencia returiz

A 11 Punteros (Apuntadores)
A 11 1 Declaracin de punteros
A 11 2 Punteros a arrays
A 11 3 Punteros a estiucturas
A 11 4 Punteros a objetos constantes
A 11 5 Punteros a void
A 11 6 Punteros y cadenas
A 11 7 Aritmtica de punteros
A 12 Los operadores new y delete
A 13 Arrays
A 13 1 Definicin de arrays
A 14 Enumeraciones, estructuras y uniones
A 15 Cadenas
A 16 Funciones
A 16 1 Declaracin de funciones
A 16 2 Definicin de funciones
A 16 3 Argumentos por omisin
A 16 4 Funciones en lnea (inl~iie)
A 16 5 Sobrecarga de funciones
A 16 6 El modificador const
A 16 7 Paso de parmetros a funciones
A 16 8 Paso de arrays

Apndice B
B1
B2
B3
B4
,

XV

Propiedades de objetos de Turbo/Borland Pascal 7.0 (Object


Pascal)
542

Objetos
Herencia
Polimorfismo y mtodos virtuales
Objetos dinmicos

542
544
545
547

Apndice C
C1
C2
C3
C4
C5
C6
C7
C8
C9
C 10
C 11
,

El lenguaje Delphi (Object Pascal) frente a C + +

, ,

El nuevo inodelo de objetos


Mtodos de clases
Definicin de mtodos
Tipos de m6todos .
Anulacin de un mtodo
Self . ,
. .
. .
Especificadores de visibilidad de clases
Construccin de un nuevo tipo derivado (Herencia)
Ligadura esttica y dinmica
Diseno de clases , ,
,
,
Reutilizacin

548
548
549
550
550
551
551
551
552
553
554
5 5'7

Apndice D . El lenguaje Ada-95. Gua de referencia


D1
D2
D3
D4
D5

Caractersticas basadas en objetos de Ada-83


Propiedades orientadas a objetos de Ada-95
..
Clases, polimorfismo y ligadura dinmica de Ada-95
Clases abstractas
Aplicaciii completa

559
,
,

559
562
566
567
569

xvi

Contenido

Apndice E. Java: el lenguaje orientado a objetos de Internet. Gua de


sintaxis
571
E 1 Caractersticas del lenguaje .Java
571
E 2 La sintaxis del lenguaje Java . . . .
572
E 3 Caractersticas eliminadas de C y C++
5 76
E 4 Los objetos
578
E 5 Herencia de clases
582
E 6 Intertaces
584
E 7 Paquetes
585
E 8 Excepciones
587
58'7
E 9. Bibliografa
E 10 Fuente de informacin en Internet
588
,

, ,

, ,

, , ,

, ,

, ,

Apndice F. Sobrecarga de operadores en C + +


F 1 Conceptos generales .
. .
F 2 Sobrecarga de operadores unitarios
F 3 Sobrecarga de operadores binarios .
F 4 Sobrecarga de operado~esde inse~ciny extraccin .
F 5 Conversin de datos y operadores de conversin forzada de tipos
F 6 Sobrecarga de new y delete: asignacin dinmica
F 7 Manipulacin de sobrecarga de operadores
F 8 Una aplicacin de sobrecarga de operadores
F 9 Resumen
,

589
589
597
603
610
614
618
621
623
625

Metodologa de anlisis y diseo orientados a objetos. Notaciones


626
Booch'93
626
OMT (Rumbaugh et a l )
629
Coad/Yourdon
633
Notacin de R Edge
636
Notacin de 'iaylor
640

Apndice G
G1
G2
G3
G4
G5

PROLOGO

Apndice H. Glosario

642

Bibliografa

651

Indice

653

LA ORlENTAClON A OBJETOS
Las teciiologas orientadas a objetos se han convertido en la dcada de los
noventa en uno de los motores clave de la industiia del software Sin embargo,
las tecnologas de objetos no es, como algunos innovadores pregonan, una
novsima tecnologa, sino que, muy al contrario, es una vieja y madura tecnologa que se remonta a los aos sesenta. De hecho, Simula, uno de los lenguajes orientados a objetos ms antiguos, fue desarrollado en 1967
El desarrollo de piogramas orientados a objetos es un enfoque diferente
del mundo informtico Implica la creacin de n~odelosdel mundo real y la
construccin de programas informticos basados en esos modelos El proceso
completo de programacin comienza con la construccin de un modelo del
suceso (evento) real El resultado final del proceso es un programa de computadora que contiene caractersticas que representan algunos de los objetos del
mundo real que son parte del suceso
El principio bsico de la programacin orientada a objetos es que un
sistema de software se ve como una secuencia de transfoimaciones en un
conjunto de objetos. El trmino objeto tiene el mismo significado que un
nombre o una frase nominal Es una persona, un lugar o una cosa Ejemplos
de objetos del inundo real son: persona, tabla, computadoia, avin, vuelo de
avin, diccionario, ciudad o la capa de ozono La mayora de los bjetos del
mundo real tienen atributos (caracterlsticas que los describen) Por ejemplo,
los atributos de una persona incluyen el nombie, la edad, el sexo, la fecha de
nacimiento, la direccin, etc Los objetos tienen atributos, y ellos, a su vez,
comportamiento El comportamiento (behavkr) es el conjunto de cosas que
puede hacer un objeto; por ejemplo, una persona puede estudiai, caminar,
trabajar, etc En sntesis, se puede decir que los objetos conocen cosas y haceiz
cosas Las cosas que un objeto conoce son sus atributos; las cosas que puede
hacer un objeto son su comportamiento
Los principios en que se apoyan las tecnologas orientadas a objetos son:
Objetos como instancia de una clase
Mtodos
Mensajes

xviii

Y las caracteristicas que ayudan a definir un objeto son:


e
e

Encapsulamiento
Modularidad
Abstraccin
Polimorfismo

Las clases se organizan pala modelar el mundo real en las siguientes


ielaciones:
e

Prlogo

Prlogo

Herencia (generalizacin/especializacin)
Agregacin
Asociacin
uso

TIPOSABSTRACTOSDE DATOSYCLASES
Una clase es una caracterizacin abstracta de un conjunto de objetos; todos
los objetos similares pertenecen a una clase determinada Por ejemplo, un
conjunto de objetos tales como cuadrados, tringulos, crculos, lneas, etc,
pertenecen a una clasefigura De modo ms formal, una clase define variables
(datos) y mtodos (operaciones) comunes a un conjunto de objetos En realidad,
una clase es un prototipo o generador de un conjunto de objetos
Una clase bien diseada especifica un tipo abstracto de dato (TAD) Un
tipo de dato es abstracto si las operaciones de alto nivel adecuadas a los tipos
de datos estn aisladas de los detalles de la implementacin asociados con el
tipo de datos As, por ejemplo, si diseamos una clase cnculo que convierte
a un crculo en un tipo abstracto de dato, la clase nos proporciona mtodos
(funciones) tales como dibujar, mover, ampliar, contraer, borrar, etc Se pueden
utilizar estos mtodos para manipular objetos cilculo de todas las formas
esperadas Los mtodos son todo lo que se necesita conocer sobre la clase
circulo Una estructura de datos fundamental de un crculo puede ser un array,
un registro, una cadena de caracteres, etc. Los detalles de la representacin
interna de un crculo se pueden ignorar mientras se crean, amplan o mueven
crculos Un crculo como tipo abstracto de dato se centra exclusivamente en
operaciones (mtodos) apropiadas a los crculos; un clculo como tipo abstracto de dato ignora totalmente la representacin interna de un crculo
La clase es el bloque de constiuccin fundamental de un lenguaje de
programacin orientada a objetos Una clase es un tipo abstracto de datos
junto con un conjunto de transformaciones permitidas de dicho tipo abstracto
de datos; puede definir tambin su interfaz a otras clases o funciones, descubriendo para ello que parte de su descripcin interna de datos o conjunto de
transformaciones permitidas pueden hacerse pblicos La regla por defecto es
que nada de una clase es pblica, a menos que se declare explcitamente por
el desarrollador de software que defini la clase
Aunque no es completamente una terminologa estndar en POO, el trmino objeto se utiliza normalmente para repiesentar una instancia de una

xix

clase Otra visin de la clase es que un tiempo de ejecucin tiene un estado,


un comportamiento y una identidad
El entorno orientado a objetos oculta los detalles de implementaciu de
un objeto Es la propiedad conocida como ocultacin de la informacin La
parte que no est oculta de un objeto es su interfaz pblico, que consta de los
mensajes que se pueden enviar al objeto L.os mensajes representan operaciones
de alto nivel, tales como dibujar un crculo El trmino encapsulamiento se
utiliza tambin para enfatizar un aspecto especfico de un tipo abstracto de
datos Un I A D combina mtodos (opeiacioizes) y representacin interna (i111pleiizentacin),
Un objeto es una instaizcia -ejeinplar o caso- de una clase que encapsula
operaciones y representacin Este encapsulamiento contrasta con la separacin tradicional de operaciones (funciones) y representacin (datos) La clase
en C + + y el paquete en Ada-95 soportan el eucapsulamiento

ANALlSlS Y DISENO ORIENTADO A OBJETOS


El problema fundamental que debe asumir un equipo de desarrollo de software
es convertir el mundo real en un programa informtica. En esencia, la tarea
clave de la piogramacin es describir las tareas de especificacin del programa
que lesuelve el problema dado,
Un problema de programacin se desciibe normalmente con un conjunto
de especificaciones (detalles que constituyen el problema real) Las especificaciones son parte de lo que se denomina anlisis orientado a objetos (AOO),
que iesponde en realidad a la pregunta Qu hace? Durante la fase de
anlisis se piensa en las especificaciones en trminos intuitivos y con independencia del lenguaje y de la mquina La etapa crtica de esta actividad es
deducir los tipos de objetos del mundo real que estn implicados y obtenei
los atributos de estos objetos deteiminando su comportamiento e interacciones
La siguiente fase del proceso de desarrollo de software es el diseo orientado
a objetos (DOO), que responde a la pregunta j,Cmo lo hace? Durante esta
fase se comienza a crear un modelo de computadora basado en el anlisis que
realice la tarea especfica concreta En esta etapa se piensa en objetos del
mundo real que pueden ser representados como objetos del mundo inforintico Se deben especificar los objetos con mayor precisin especificando en
detalle lo que los objetos conocen y lo que pueden hacer, y describe con
prudencia sus interacciones Durante la fase de diseo se pueden encontrar
atributos tiles adicionales y comportamiento de los objetos que no.aparecieron en la fase de anlisis o no estaban definidos con claridad
La diferencia entre A 0 0 y D O 0 no es clara, y es difcil definir la transicin
entre ambas etapas De hecho, ninguna de las metodologas de 00 clsicas,
como Yourdon/Coad, Booch o Rumbaugh (OMT) proporcionan reglas precisas para pasar de una etapa a otra De hecho, las fases A 0 0 y D O 0 no
representan un proceso estricto de dos etapas, y a veces se funden en una sola
Normalmente, ocurrir que el modelo inicial que se selecciona no es el apro-

xx

Prlogo

Prologo

piado, y se necesita retroceder y volver a reiterar el proceso sucesivamente Se


pueden descubrir especificacioiles adicionales que no se conocan al comenzar
su trabajo iriicial y encontrar que los atributos o comportamiento de un objeto
sean diferentes de lo que se decidi en la etapa de anlisis De cualquier forma,
el mejor medio para practicar desarrollo de software orientado a objetos es
realizar el anlisis y diseo de ejemplos de todo tipo Por esta causa, en el
libro se incluyen numerosos ejemplos que tratan de ayudar al lector a familiarizarse con la P O 0
L.a fase de diseo conduce a la fase de iinplementacin, que consiste en
traducir dicho diseo en un cdigo real en un lenguaje de programacin 00
La fase de codificacin del proceso de desarrollo 00 se llama programacin
orientada a objetos (POO).
El proceso de desarrollo orientado a objetos supone, en sntesis, la construccin de un modelo del mundo real que se pueda traducir posteriormente
en un cdigo real escrito en un lenguaje de programacin 00 En realidad,
las tres fases, anlisis, diseo y programacin, interactan entre s L.as decisiones de progiamacin pueden cambiar algunos aspectos del modelo o pueden refinar lealmente algunas decisiones anteriores
Los objetos pueden cambiar, o incluso modificarse o deducirse de otros
objetos; atributos y comportamiento se pueden tambin modificar o aadir a
cada objeto En resumen, el anlisis, diseo y programacin no constituyen
un proceso nico de tres etapas para la resolucin de un problema, sino que
todas las etapas interactan entre s para resolver los problemas del mundo
real Sin embargo, como regla general, el anlisis se debe hacer antes del
diseo, y ste se ha de hacer antes de la programacin o codificacin

NOTACIONES ORIENTADAS A OBJETOS


El mejor sistema para modelar el mundo real con objetos de un modo prctico
es disponer de una notaciii grfica consistente y eficiente Cada metodologa
de anlisis y diseo orientado a objetos posee su propia notacin
Nuestra experiencia en estos cinco ltimos aos impartiendo c u ~ s o sde
A 0 0 y D O 0 a estudiantes de pregrado, postgrado y profesionales nos ha
llevado a seleccionar las notaciones que personalmente hemos comprobado
que son las ms idneas, tanto desde el punto de vista pedaggico como
profesional Pensando en un aprendizaje rpido y gradual, hemos seleccionado
tres metodologas de las ms populares:
Coad/Yourdon
Booch'93
OMT (Rumbaugh et al)
Junto con otras dos notaciones, que si bien no son tan conocidas, a
nosotros nos han resultado de gran valor y podemos considerarlas excelentes
para el aprendizaje de objetos Son las notaciones de Raimund K Ege y David
T'aylor, que hemos incluido en el texto y con ejemplos inspirados en sus textos

xxi

base, que se recogen en el momento oportuno y en la bibliografa, y que


recomendamos como lecturas notables y excelentes, as como referencia obligada de todo buen estudioso de las tecnologas de objetos

PROGRAMACION ORIENTADA A OBJETOS


La programacin orientada a objetos es una extensin natural de la actual
tecnologa de programacin, y representa un enfoque nuevo y distinto al
tradicional Al igual que cualquier otro programa, el diseo de un programa
orientado a objetos tiene lugar durante la fase de diseo del ciclo de vida de
desarrollo de software El diseo de un programa 00 es nico en el sentido
de que se organiza en funcin de los objetos que manipular De hecho,
probablemente la parte ms difcil de la creacin de software orientado a
objetos es identificar las clases necesarias y el modo en que interactan entre s
Desgiaciadamente, no hay reglas fciles para determinar las clases de un
programa dado L.a identificacin de clases puede ser tanto arte como ciencia
El proceso es algo impreciso, y por esta causa han surgido numerosos mtodos
que propoicionan reglas para la identificacin de clases y las relaciones que
existen entre ellas; estos mtodos son los citados anteriormente

EL LENGUAJE C++
C + i todava no es un lenguaje estndar, aunque ya se encuentra en la fase
final de estandarizacin C + + es sin duda el lenguaje del futuro, y marca las
pautas de desarrollo para nuevos lenguajes, como es el caso de Java, el
lenguaje de programacin orientado a objetos para desarrollo en Internet, o
Ada-95, el lenguaje de desarrollo para sistemas en tiempo leal tambin orientado a objetos
L.as caracteristicas comunes ms importantes a las nuevas veisiones de
C + + son:

C + + es esencialmente un superconjunto de C ANSI,


C + + tiene las mismas caractersticas de tipificacin que C ANSI para
propiedades no 00
Los compiladores de C + + aceptan normalmente cdigo escrito en la
versin original de K&R (Kernighan y Ritchie) Generalmente, los co111piladores de C + + propoicionan mensajes de error o advertencia cuando
el cdigo C no tiene prototipos
Desde el punto de vista especfico de sintaxis, algunas caracteristicas de
C han sido mejoradas notablemente:

Las funciones de entradalsalida printf y scanf se utilizan raramente en C + + , y en su lugar se emplean cin y cout, que realizan
un trabajo mejor y ms eficiente

2
3
4

Las constantes #define y las macios han sido sustituidas por el


calificador const y las funciones inline
Identificadores de tipos en tiempo de ejecucin
Espacios de nombre

L.as piincipales diferencias entre los diversos compiladores de C + + son,


adeins del precio, entornos integrados de desarrollo (editores, depuradores, etc ), velocidad de compilacin, velocidad del cdigo ejecutable, sistema en
tiempo de ejecucin, calidad de mensajes de error e interoperabilidad de
cdigo con otro software: tales como sistemas operativos, sistemas de ventana,
enlazadores u otros programas de aplicacin
Otras diferencias incluyen soporte para inanejadores de excepciones y
plantillas (templates) La mayora de los compiladores actuales proporcionan
soporte para ambas propiedades Los manejadores (haizdleis) de excepciones
son construcciones que permiten a los programas recuperar su control ante
eirores en tiempo de ejecuciil no previstos Las plantillas permitirn a las
clases ser definidas mediante tipos genricos de datos

HISTORIA

DEL LENGUAJE C++

Al principio de los ochenta, Bjarne Stroustrup dise una extensin del lenguaje C al que Ilain C con clases, debido a que su caracterstica fundamental
eia aadirle clases a C El concepto de clase proceda de Simula 67 y serva
para captuiar el comportamieilto del inundo real a la vez que oculta los
detalles de su implementacin
En 1983-84, C con clases fue rediseado, extendido e implementado en un
compilador El lenguaje se denomin C + + y fue descrito poi Stroustrup en
Data Abst~actioiziiz C en el Iechnical Jouinal (vol 63, nm. 8, octubre 1984),
de AT&T Be11 Laboratories L.a primera versin comercial de C + + estuvo
disponible en 1985 y se document en el libio de Bjarne Stroustrup Ilze C + +
Prograi?ziizinqLanguage, editado por Addison-Wesley en 1986.
El nombre de C++ fue elegido coino variante del lenguaje de programaci6n C Dado aue eia una extensin de C, se decidi elegir C + + debido a
que el opeiador
significa aadir uno a la variable y poi consiguiente
el lenguaje C + + se supondra que era una ve~sininmediatamente superior o
siguiente a C
En realidad, Stroustrup cre C + + con dos objetivos principales: (1) hacer
compatible C + + con el C ordinario, y (2) ampliar C con construcciones de
P O 0 basadas en la construccin clase de Simula 67. El lenguaje en su forma
actual ha sido descrito en 1990 por Stroustrup y Ellis en el Anizotated C + +
Refereizce Maiiual (el ARM)', que sirve como documento base para la estan~-~

++

MARGARET
E ~ r r sy BJARNE
SrxousrRuP: Tiie Aniiotatud C + + Refefei.eiiie Ma~lual Reading,
Mass, Addisoii-Wesiey, 1990 Existe versin en espaol con el ttulo C + + Maiiual de refeieizcia
coi? ai~utacioizei editado por Addison-\l'esley/Daz de Santos en 1994

dariracin de la versin 3 0, actualmente en fase de estandarizaciii por el


comit ANSI
Como C + + es una extensin del C estndar, la mayoila de los progiamas
C se pueden compilar utilizando un compilador C + +
L.a versin actual estandarizada por ANSI -la citada actualizacin 3 0es la que soportan la mayora de los fabricantes mundiales: Borland, Microsoft, Watcom, AT&T, etc., en sus ltimas actualizaciones tales como 4,515 de
Borland, Visual C + + 4, la 10 de Watcom, etc

OBJETIVOS DEL LIBRO


Piogiaiizatin Oiieiztada a Objetos Coiiceptor, rizodelado, diseio y codificaciiz
eiz C + + , es una obra, como su nombre indica, esencialmente de objetos.. Trata
fundamentalmente de ensear a programar con tecnologas de objetos, pero
al contrario que otras obras -incluso algunas nuestras- centradas exclusivamente en un lenguaje de programacin orientada a objetos -casi siempre
C++-, hemos pensado que sera muy interesante -sin abandonar el estudio
de C++- dar mayor importancia a los conceptos tericos y prcticos fundamentales del mulido de objetos, que slo son tratados por libros especficos
de las metodologas de A O O / D 0 0 e incluso ingenieria de software 00 y
otros de caicter avanzado
Desde finales de los ochenta, en que decidimos adentiarnos en las emergentes tecnologas de objetos, se ha producido un cambio radical en el mundo
de la ingenieria de software L,os objetos que los aos 1988 a 1990 se centraban
en experiencias sobre el primitivo lenguaje C + + y Sinalltalk e incipientes
trabajos en Eiffel, comenzaron a pasar en los aos 1990 a 1992 al campo
profesional, y as nacieron las inetodologas de anlisis y diseo orientadas a
objetos de primera generacin y que han facilitado la transicin al nuevo
paradigma Las metodologas pioneras se deben a Shlaer y Mellor, que, junto
con Rebeca WirkBrocks, se consideran como creadores del modelado de objetos; Yourdon/Coad, autores consolidados de metodologas estrnctuiadas que
se pasaion a metodologas de objetos, y lanzan en esos aos dos excelentes
libros sobre anlisis y diseo 0 0 ; Grady Booch, uno de los pioneros del
mundo de ingeniera de software en tiempo real con Ada, que aprovecha su
experiencia para lanzar una metodologa de diseo 00 que se ha hecho muy
popular y cuya ltima edicin se public en 1993; Rumbaugh et al, autores
de la metodologa OMT, seguramente la metodologa ms utilizada en el
mundo del software en estos ltimos aos
La siguiente frontera se produce en 1995, cuando se publica el borrado1 0.8
del mtodo unificado diseado por la unin en una misma empresa (Rational),
de Grady Booch y James Rumbaugh, que han contado tambin con la colaboracin de Ivar Jacobson, creador del use case -caso de uso-, concepto
terico fundamental que se ha impuesto en todos los buenos desarrollos de
00 de los ltimos aos Desde el punto de vista del lenguaje se est estandarizando C + + con la versin 3 0 de AT&T y se ha estandarizado Ada con la

xxiv

versin Ada-95, y se han lanzado al mercado otros lenguajes de objetos


hbridos: Object Pascal, Object COBOL, Delphi, Visual BASIC 4 -con ciertas caractersticas de objetos-, Visual Object, etc Los lenguajes puros clsicos
como Eiffel y Smalltalk luchan por hacerse un hueco en el mercado profesional, saliendo de los laboratorios de investigacin y universitarios hacia el
mundo profesional Internet, el fenmeno social y tecnolgico de la dcada de
los noventa y del futuro siglo XXI, ha trado el advenimiento de Java un
lenguaje 00 evolucionado de C + + que la empresa Sum lanz el ao pasado
y que promete conveitirse en un duro competidor de C + +
Teniendo presente el estado del arte de la ingeniera de software orientada
a objetos y nuestra experiencia peisonal en el Departamento de Lenguajes y
Sistemas Inf'ormticos e Ingeniera de Software de la Universidad Pontificia
de Salamanca en Madrid, donde hemos impartido numerosos cursos de progiamacin, anlisis y diseo orientados a objetos, as como otros cursos,
seminarios y conferencias en otras universidades espaolas y latinoamericanas
y en empresas informticas inultinacionales y escuelas de la administracin
pblica espaola, hemos considerado los numerosos consejos, sugerencias y
crticas de alumnos y colegas, y como resultado hemos escrito un contenido
para esta obra que contiene los conceptos vitales de las tecnologas de objetos
que confiamos permitan una progresin y aprendizaje rpido y eficiente por
parte del lector en el inundo de la programacin orientada a objetos Para
cumplir estos objetivos, pensamos que sera muy interesante mezclar con el
mximo de prudencia conceptos fundamentales tales como:

Prlogo

Prlogo

Tipos abstractos de datos


Clases y objetos
Relaciones de objetos: generalizaci6n/especializacin,
Herencia
Modelado de objetos,
Diseo orientado a objetos
Fundamentos de reutilizacin de software con objetos
Bibliotecas de clases,

As pues, la obra considera los conceptos terico-prcticos importantes


de la programacin orientada a objetos, junto con los mtodos correspondientes de codificacin en C + + El contenido del libro se ha diseado de modo
que pueda permitir al lectoi ya iniciado en objetos y/o C + + , y al no iniciado
adentrarse en el mundo de los objetos de un modo gradual y con la mayor
eficacia posible, Para ello se ha pensado que el mejor mtodo podra ser
ensear al lectoi las tcnicas de modelado del mundo real mediante objetos,
de modo que cuando se tuviera el modelo idneo se pudiera pasar fcilmente
a la codificacin de un programa que resolviera el problema en cuestin
Para conseguir estos objetivos hemos credo conveniente hacer uso no slo
de los conceptos tericos ya mencionados, sino recurrir a una herramienta
grfica que facilite al lector realizar el anlisis y diseo previo a la programacin que redunde en el mayor grado de eficiencia por parte del progr amador

XXV

CONTENIDO DEL LIBRO


Este libro se apoya fundamentalmente en el emergente paradigma de la orientacin a objetos y trata de ensearle sus conceptos bsicos, as como las
tcnicas de programacin de dicho paradigma. Supone que el lector tiene
experiencia anterior en programacin en algn lenguaje, tal como BASIC, C
o Pascal; tambin supone que el lector tiene experiencia en editar, compilar,
enlazar y ejecutar programas en su computadora De cualquier forma, pensando en los lectores que no conocen C ni C + + , hemos incluido un apndice
que contiene una gua de referencia del lenguaje C + + , junto con una parte
completa (Paite IV) que incluye tres captulos que pretenden ensear al lector
la transicin de C a C + +, o simplemente el lenguaje C + + , caso de no conocer
C/C++, as como reglas picticas para poner a punto programas en C + + ,
con una amplia relacin de errores tpicos cometidos en piogramas,
El libro consta de cuatro partes que contienen quince captulos, todos ellos
con una estructura muy similar: teora y ejeilzplos prcticos desarrollados en la
versin 1 0 de C + + de ANSI, de modo que prcticainente podr utilizar con
cualquier compilador de los coinercializados en la actualidad de las empresas
Borland, Microsoft, Watcom, etc; un reyuiizeiz del capitulo y eje~ciciospropuestos al lector, de modo que pueda practicar los conceptos aprendidos en el
captulo correspondiente
La Parte 1, El mundo de la orientacin a objetos, describe los conceptos
fundamentales de objetos, relaciones, modelado y lenguajes de programacin
orientada a objetos (LPOO) El Capitulo 1 ofrece una visin general del
desarrollo del software, con una revisin de los conceptos clave del mismo,
que abarcan desde los factores de calidad del software a la reutilizaciiz de
software, pasando poi conceptos clave, como abstraccin de datos, encapsulamiento, jerarqua y polimorfismo, entre otros El Captulo 2 es una revisin
del iinportante concepto de modularidad y su pieza clave los tipos abstractos
de datos Se han utilizado como herramientas de programacin los lenguajes
Modula-2, Ada, Turbo Pascal, C y C + + El Captulo 3 es una descripcin
exhaustiva de los conceptos fundamei~talesde la programacin orientada a
objetos (clases, objetos, lenguajes, herencia, sobrecarga, ligadura, objetos compuestos y reutilizaciii) El Capitulo 4 describe los lenguajes de POO, los
clasifica y realiza una sntesis de las propiedades orientadas a objetos de los
lenguajes seleccionados, en este caso Ada, Eiff'el y Smalltalk El Captulo 5
trata el importante concepto de ruodelado El proceso de desarrollo de un
sistema de software comienza con la construcciil de un modelo del mundo
real Este modelo captura normalmente las caractersticas ms significativas
del problema, y para ello se apoya en el concepto de relaciones entre clases
Las diferentes relaciones junto con la importante propiedad de la herencia y
sus tipos, se describen tambin en el Captulo 5
L.a Parte II incluye los Captulos 6 al 11 y explica los fundamentos de la
programacin orientada a objetos (POO) con C + + El Capitulo 6 describe
cmo declarar y construir clases, diseos y reglas prcticas para la construccin de clases El Captulo 7 examina las clases abstractas y la propiedad de
la herencia, junto con la sintaxis para su implementacin y el problema de la

xxvi

Prologo

Iierencia repetida; el captulo se termina con una aplicacin prctica El


Captulo 8 presenta la propiedad de polimorfismo, junto con el concepto de
ligadura El Capitulo 9 describe las plantillas (te~nplater)y muestra el concepto
de genericidad; examina la sintaxis para declarar plantillas de funciones y de
clases, as como la definicin de sus funciones miembro y el modo de instanciai
las clases El Captulo 10 presenta el concepto de excepcin, junto con su
manejo o manipulacin (eirores en tiempo de ejecucin), y examina el mtodo
empleado por C + + para lanzar y capturar excepciones; se describe la sintaxis
de C + + para implementar estas operaciones y muestra cmo manejar excepciones El Captulo 11 describe la reutilizacin de software con C + + y los
diferentes mtodos einpleados para ello Asimismo, se describen las bibliotecas
y contenedores de clases
La Parte 111 incluye el transcendental Capitulo 12, que describe los principios para el desarrollo orientado a objetos y especialmente su diseo Se
describen las notaciones grficas de las metodologas Booch, YourdonJCoad
y Ruinbaugh (OMT), junto con las reglas prcticas para la implementacin
con C + + de las diferentes relaciones entre clases; se incluye una pequea
aplicacin orientada a objetos L.a Parte IV El lenguaje C + + : Sintaxis,
construccin y puesta apunto de programas contiene los Captulos 13 a 15
El Captulo 13 describe las caractersticas ms sobresalientes de C + + que lo
diferencian de C en el sentido de mejorarlo y ampliarlo. El Captulo 14 explica
un sistema pictico para construir programas en C/C++ junto con el concepto de programas multiarchivos y el sistema para construir arcliivos proyecto La puesta a punto de programas en C + + se explica en el Captulo 14; en
este captulo se dan reglas picticas para depurar programas con una extensa
enumeracin de errores tpicos en el desarrollo de programas
Aunque el lenguaje base del texto es C + + se pretende que el lector pueda
codificar fcilmente los conceptos fundamentales de objetos y comenzar el
aprendizaje de la P O 0 con otros lenguajes Por esta causa los Apndices A a
E incluyen guas de referencias de sintaxis de los lenguajes C + + , Delphi,
TuiboJBorland Pascal, Ada-95 y lava -el nuevo lenguaje orientado a objetos
de Interrzet- El Apndice F explica un concepto importante y especfico de
C + i : la sobrecaiga de operadores L.a serie de apndices se coinpleta con el
Apndice G, que contiene sntesis de las notaciones grficas de las metodologa~de anlisis y diseo oiieiitadas a objetos ms populares y usadas en el
libro Estas iiotacioiies se han extrado de las fuentes originales de las metodologa~utilizadas: Booch'93, OMT (Rumbaugh et al) y Coad/Yourdon Por
ltimo, se incluye un glosario de trminos de objetos que facilitan la comprensin del lector La bibliografa contiene los libros consultados por el autor en
la escritura de la obra, incluyendo los libros base de las metodologas de A 0 0
y D O 0 utilizadas en el libio,

AGRADECIMIENTOS
Muchas son las peisonas que me han prestado ayuda de una u otra forma en
la elaboracin de esta obia y a las que debo mi agradecimiento ms sincero

Prlogo

xxvii

E n particular, deseo expresa1 ini reconocimiento a mis colegas del Departainento de Lenguajes y Sistemas Informticos de la Facultad y Escuela Universitaria de Informtica de la Universidad Pontificia de Salamanca, en el
cuiiipus de Madrid, que han impartido e imparten conmigo Prvgramaciit
Orieittaa a Objetos dentio de la asigiiatuia Metodologa de la Programacin,
as coino Anlisis y Diseo Orientados a Objetos, cuyas sugerencias, consejos y
crticas han permitido los apuntes originales de la asignatura en este libro que
hoy ve la luz Estos profesores son: Ignacio Zahonero, Antonio Reus, Paloina
Centeiiera, Rosa Hernndez, Rafael Ojeda, Fernando Davara, M.TL.uisaDez,
Daniel Gaica y L.uis Doieste De un modo especial han contribuido a esta
obra las profesoras Paloma Centenera, Mara Luisa Dez y Rosa Hernndez,
que han volcado su experiencia docente personal en la revisin de las galeiadas
de esta obra; tras su lectura han detectado erratas y sobre todo me han dado
consejos, sugerencias y aportaciones personales que han permitido mejoiar la
versin original de esta obra Gracias, amigas y colegas, por vnestia ayuda
Tambin el piofesor Ignacio Zahoneio ha leido parte de las galeradas y me
ha sugerido ideas de mejora Aunque no han intervenido directamente en la
obra hay nunierossiinas peisonas que han contribuido eficientemeiite en la
redaccin final de esta obra, sin su colaboiacin esta obra no estara ahora
en la calle Son todos mis alumnos de los ltimos cinco aos a los que he
impaitido cursos, seminarios y conferencias sobre tecnologas oiientadas a
objetos (anlisis, diseo, programacin y bases de datos) en universidades
espaolas y latinoamericanas, as coino en centros de formacin de empresas
multinacionales y de la administracin espaola Ellos me haii alentado eii
todo momento a difundir las teciiologas de objetos y de ellos he recibido todo
tipo de citicas, consejos y sugerencias que he volcado en muchos casos en el
libro Por ltimo, deseo expiesar de modo muy especial mi agiadecimiento a
Joige Piernavieja, mi antiguo editor -y, sin embargo, anzigo- que inici la
edicin de esta obra y que por sus nuevas iespousabilidades profesionales iio
la ha podido terminar, pero su coiisejo y aliento al igual que tantas otras veces
nunca me faltaron. A mi nuevo editor y tambin amigo Pepe Doinnguez que
ha teiiiiinado la obra; mi agradecimiento por su paciencia y comprensin Al
lector que ha confiado en esta obra en la esperanza de que le sea lo ms til
y eficaz posible en su formacin en programacin orientada a objetos
En Ca~chelejo(Andaluciu-Espaiia), verano de 1996
El autor

PARTE

EL M U N D O DE LA ORlENTAClON
A OBJETOS: CONCEPTOS,
RELACIONES, MODELADO
Y LENGUAJES
DE PROGRAMACION

EL DESARROLLO DE SOFTWARE

CONTENIDO
1 1 La complejidad inherente al software
1 2 La crisis del software
1 3 Factores en la calidad del software
1 , 4 Programacin y abstraccin
1 , 5 El papel (el rol) de la abstraccin
1 6 Un nuevo paradigma de programacin
1 7 Orientacin a objetos
1 8 Reutilizacin de software
19. Lenguajes de programacin orientados a objetos
1 , 1 0 Desarrollo tradicional versus orientado a objetos
111. Beneficios de las tecnologas de objetos (TO)
RESUMEN

La dcada de los noventa ser, sin lugar a dudas, la dcada de


la programacin orientada a objetos Como Rentsch predijo,
la programacin orientada a objetos ser en los ochenta lo
que la programacin estructurada fue en la dcada de los setenta. En la actualidad la programacin orientada a objetos
se ha hecho enormemente popular Escritores y diseadores
de software, junto a compaas importantes en el campo del
software, se dedican de modo continuo a producir compiladores de lenguajes, sistemas operativos, bases de datos, etc,
orientados a objetos
Qu es la programacin orientada a objetos? Por qu es
tan popular? La programacin orientada a objetos es algo ms
que una coleccin de lenguajes de programacin, tales como
Smalltalk, Object Pascal, C++, etc Se podra decir que este
tipo de programacin es un nuevo medio de pensar sobre lo
que significa computar (computadorizar), es decir, cmo se
puede estructurar informacin en un computador

Programacin orientada a objetos

1.1.. LA COMPLEJIDAD INHERENTE AL SOFTWARE


Como Brooks sugiere, la coinplejidad del software es una propiedad esencial,
no accidental Esta complejidad inherente al software, como dice Booch, se
deriva de cuatro elementos: la complejidad del dominio del problema, la dificultad de gestionar el proceso de desarrollo, la posible flexibilidad a travs del
software y los problemas de caracterizacin del comportamiento de sistemas
discretos

1.1.1. La complejidad del dominio del problema


Los pioblemas que se intentan resolver con software implican normalmente
elementos de ineludible coinplejidad, en los que se encueiitran una gran cautidad de requisitos, en muchas ocasiones contiadictorios Esta complejidad se
produce por las dificiles interacciones entre los usuarios de un sistema y sus
desarrolladores: los usuarios encuentran generalmente muy difcil dar precisin
sobre sus necesidades de forma que los desarrolladores puedan comprender En
casos extremos, los usuarios pueden tener slo ideas vagas de lo que se desea en
un sistema software
Por otra parte, los usuarios y desarrolladores tienen diferentes perspectivas
de la naturaleza del problema y hacen suposiciones diferentes sobre la natnraleza de la solucin El medio comn de expresar los requisitos hoy da es utilizar
un giaii volumen de textos, en ocasiones acompaados por esquemas y dibujos
Tales documentos son difciles de comprender, estn abiertos a diferentes interpretaciones y con frecuencia contienen elementos que son diseos en lugar de
requisitos esenciales
Otra complicacin frecuente es que los requisitos de un sistema software
cambian durante su desariollo Esto supone que un sistema grande tiende a
evolucionar con el tiempo y el mantenimieiito del software en ocasiones es un
trmino que no siempre est bien acuiado
Para ser ms preciso, existen diferentes trminos a definii: el mantenimiento
busca errores; la evolucin responde a cambios de requisitos, y la conservacin,
cuando se utilizan medios para mantener piezas de software en funcionamiento
Desgraciadamente, la realidad sugiere que un porcentaje alto de los recursos de
desarrollo de software se gastan en la conservacin del software

1..1.2. La dificultad de gestionar el proceso de desarrollo


El tamao de un piograma no es una gran virtud en un sistema de software Sin
embargo, la esciitura de un gran programa requiere la escritura de grandes
cantidades de nuevo software y la rentilizaciu del software existente Recordemas que hace dos o tres dcadas los progiamas en lenguaje emsamblador se
construan a base de centenares de lneas Sin embargo, hoy es usual encontrar
sistemas en funcionamiento cuyo tamao se mide en centenares de millares, o

incluso millones de lneas de cdigo Esta caracterstica se facilita descomponiendo nuestia implementacin en centenales y a veces millones de mdulos
independientes Esta cantidad de trabajo exige el uso de un equipo de desarroIladores, aunque se trata por todos los medios de que este equipo sea lo ms
pequeo posible Ahora bien, a medida que haya ms desarrolladores, se producen comunicaciones entre ellos ms complejas, e incluso con coordinacin
difcil entre ellos, particularmente si el equipo est disperso geogrflcamente,
como suele ser el caso de proyectos grandes
La rotura de una aplicacin en entidades y relaciones que son significativas
a los usuarios es un anlisis convencional y tcnicas de diseo Con la programacin orientada a objetos, este pioceso de descomposicin se extiende a la
fase de implementacin. Es ms fcil disear e implementar aplicaciones orientadas a objetos, ya que los objetos en el dominio de la aplicacin se corresponden directamente con los objetos en el dominio del software

1.1.,3.. La flexibilidad a travs del software


El software ofrece flexibilidad, de modo que es posible para un desarrollador
expresar prcticamente cualquier clase de abstraccin.
Los sistemas orientados a objetos proporcionan el rendimiento, la flexibilidad y funcioualidad requerida para implementaciones prcticas La programacin se puede hacer con extensiones de lenguajes comerciales, tales como
Object-Pascal (Turbo Pascal, Borland Pascal, Mac Pascal, etc) y C + + , que
incorporan a sus tpicas propiedades las propiedades oiientadas a objetos, y
lenguajes 00 puros, como Smalltalk y Eiffel Por otra parte, las ayudas de
programacin actual mejoran la capacidad del programador para administrar
y modificar sistemas mientras se desarrollan
La programacin orientada a objetos expande tambin la variedad de aplicaciones que se pueden programar, debido a que se Iiberan las restricciones de
los tipos de datos predefinidos
L.a programacin orientada a objetos acomoda estructuras de datos heterogneo~y complejos Se pueden aadir nuevos tipos de datos sin modificar
cdigo existente

1.,2..
LA CRISIS DEL SOFTWARE
En 1968 una conferencia sobre software, patrocinada por la OTAN, asumi los
trminos iizgenieiia del roftware y ciisis del software Con estos trminos se
quera expresar que el software era caro, poco fiable y escaso
Las metodologas y tcnicas estructurales que han reinado en la dcada de
los setenta y ochenta no han eliminado el problema, y de hecho la crisis del
software contina hoy en da Pese a las muchas herramientas y mtodos utilizados, los problemas del diseo descendentes permanecen igual, posiblemente
debido a que la complejidad del problema ha crecido considerablemente

Programaoon orientada a objetos

El desarrollo de soitware

Entre las diferentes fases del ciclo de vida del software (Fig 1 l), el mantenimiento, aunque en tiempos fue despreciada su importancia, se considera actualmente como u110 de los problemas ms rigurosos en el desarrollo del software
Anlisis

Diseo
Implementacin

Figura 1 1 Ciclo de vida del software,

Muchos investigadores sugiere11que los costes de software requieren ms de


la mitad de los costes y recursos globales en el desarrollo de software
Implernentacin Depuracin
7%
Anlisis

15 %

Los cambios iealizados en la evolucin de un progiama son el punto dbil


de los mtodos tradicionales de desarrollo de software, siendo paradjicamente
uno de los puntos fuertes de los mtodos de desarrollo de software orientado a
objetos
En 1986, Fredrick P Brooks', en un famoso artculo, apuntaba que en los
ltimos diez aos no se haba pioducido ningn progreso significativo en el
desarrollo de software, y analizaba ciiticamente todas las tecnologas ms piometedoras Aunque l confesaba que tena ms confianza en la prograiilacin
orientada a objetos que en cualquiei otra tecnologa, mantena dudas sobre sus
ventajas efectivas
Recientemente, las propuestas de reusubilidud o i eulilizacin, reusability,de
coinponeilles soJtiva~e,se considera11 como bloques iniciales para la construccin del prograina, de modo siinilar a la conslruccin de cualquier objeto
complejo (tal como un automvil) que se construye ensamblando sus partes
En respuesta al artculo de Brooks, Brad Cox2, el inventor de Objective-C,
public un artculo en el que esencialmente rebata las tesis de Biooks:
Existe una bala de plata Es un arma tremendaineiite potente, impulsada poi
vastas fueizas ecouniicas a la aue nuevos obstculos tcnicos slo pueden resistii
brevemente
La bala de plata es uii cambio culru~ulen lugar de un cambio tecnolgico Es
un nuevo paiadigma; una revoluciii industrial basada en partes ieutilizables e
intercambiables que modificain el universo del software, de igual modo que la
revolucin industrial cambi la fabricacin
Por consiguiente, la P O 0 (Prograinacin Orientada a Objetos) no slo son
nuevos Ieilguajes de piogramacin, sino un nuevo modo de pensar y diseilai
aplicaciones que puede11 ayudar a resolver pioblemas que afectan al desaiiollo
del software Sin embargo, el lenguaje debe ser capaz de soportar el nuevo
paradigma, siendo por consiguiente uiia parte esencial de esta ievolucin

1..3. FACTORES EN LA CALIDAD DEL SOFTWARE


La constiuccin de software requiere el cumplimiento de iiumeiosas caiacteristicas Entre ellas se destacan las siguientes:

Eficiencia

Mantenimiento

La eficiencia del software es su capacidad pala hacer u11 buen uso de los recuisos que manipula

67 %

Figura 1 2

Costes de las diferentes fases del ciclo de vida


de un proyecto software.

Bnoo~s,Fredeiik P li : N o Silvei Bullet~,Coiiipurei 10-19, abril 1986


Cox, Biad J : Thei-e is a Silver Bulleta, Bi,te 209-218, octubre 1987

Prograrnacion orientada a objetos

Transportabilidad portabilidadl

La transportabilidad o portabilidad es la facilidad con la que un software


puede ser tiansportado sobre diferentes sistemas fsicos o lgicos
Verificabilidad

L.a verificabilidad es facilidad de verificacin de un softwaie; es su capacidad


para soportar los procedimientos de validacin y de aceptar juegos de test o
ensayo de programas
Integridad

La integridad es la capacidad de un softwaie para proteger sus propios componentes contia los procesos que no tengan derecho de acceso
Fcil de utilizar

Un software es fcil de utilizar si se puede comunicar con l de manera cmoda


Correccin

Capacidad de los productos software de realiza1 exactamente las tareas definidas por su especificacin
Robustez

Capacidad de los productos soflwaie de funcionar incluso en situaciones anormales


Extensibilidad

Facilidad que tienen los productos de adaptarse a cambios en su especificacin


Existen dos principios fundamentales para conseguir esto:
diseo simple;
descentralizacin
Reutilizacin

Capacidad de los productos pata ser reutilizados, en su totalidad o en parte, en


nuevas aplicaciones
Compatibilidad

Facilidad de los productos para ser combinados con otros

El desarrolio de software

1..3.1.. Razones fundamentales que estn influyendo


en la importancia de la PO0
Algunas de las causas que estn influyendo consideiablemente en el notable
desarrollo de las tcnicas orientadas a objetos son:
L.a 00 (Orientaciii a Objetos) es especialmente adecuada para iealizar
determinadas aplicaciones, sobre todo realizacin de prototipos y simulacin de programas
Los mecanismos de encapsulacin de P O 0 soportan un alto grado
de reutilizacin de cdigo, que se incrementa por sus mecanismos de
herencia
En el entorno de las bases de datos, la 00 se adjunta bien a los n~odelos
semnticos de datos para solucionar las limitaciones de los modelos tradicionales, incluido el modelo relaciona1
Aumento espectacular de L.POO (Lenguajes de Programacin Orieiltados a Objetos)
Interfaces de usuario grficos (por iconos) y visuales Los interfaces de
usuario de una aplicacin manipulan la entrada y salida del usuaiio Por
consiguiente, su funcin principal es la comunicacin con el usuario final
L.a entrada al sistema se puede controlas a travs de lneas de rdenes
(enfoque utilizado por DOS y UNIX), o alternativamente el usuario puede interactuar con el sistema, con construccioiies de programacin visuales, tales como iconos de mens, Windows, Macintosh, etc
Estas razones hacen fundamentalmente que dentro de las tendencias actuales de la ingeniera de software, el marco de P O 0 se revela como el ms
adecuado para la elaboracin del diseo y desarrollo de aplicaciones
Este marco se caracteriza por la utilizacin del diseo modular 00 y la
reutilizacin del software Los T'AD (Tipo Abstracto de Dato) ha11 aumentado
la capacidad para definir nuevos tipos (clases) de objetos, cuyo significado se
definir abstractamente, sin necesidad de especificar los detalles de implementacin, tales como la estructura de datos a utilizar para la representacin de los
objetos delinidos
Los objetos pasan a ser los elementos fundamentales en este nuevo marco,
en detrimento de los subprograinas que lo han sido en los marcos tradicionales

1..4. PROGRAMACION Y ABSTRACCION


Para comprender mejor el significado de la revolucin que suponen las tecnologas orientas a objetos, se va a examinar uno de los elementos fundamentales:
p~oyiamacinpol. abst~accin
En general, un programa no es ms que uiia descripcin abstracta de un
procedimiento o fenmeno que existe o sucede en el mundo real Frecuentemente, un programa imita un comportamiento o accin humana; otras veces
simula (es decir, lo reproduce) un fenmeno fsico

10

Proqrarnacin orientada a objetos

Sin embargo, la relacin entre abstraccin y lenguaje de programacin es


doble: poi un lado se utiliza el lenguaje de programacin para escribir un
programa que es una abstraccin del mundo leal; por otro lado se utiliza el
lenguaje de progiamacin para desciibir de un modo abstracto el comportamiento fsico de la computadora que se est utilizando (por ejemplo utilizando
nmeros decimales en lugar de nmeros binarios, variables en lugar de celdas
de memoria direccionadas explcitamente, etc)
En la dcada de los cincuenta, el nico mecanismo de abstraccin era el
lenguaje eiisan~bladory de mquina, que ofreca la posibilidad de utilizar nombres simblicos para representar celdas de memoiia Posteriormente, los lenguajes de alto nivel ofrecieion un nuevo nivel de abstraccin
El arte de la prograiilaciiz es el mtodo por el que se describir a una
computadora (mediante un lenguaje de prograinacin) un fenmeno, una accin, un comportamiento o una idea

1.5.. EL PAPEL (EL ROL) DE LA ABSTRACCION


Los piograinadores han tenido que luchar con el problema de la complejidad
durante mucho tiempo desde el nacimiento de la informtica Para comprender
lo mejor posible la importancia de las tcnicas orientadas a objetos, reviseinos
cules han sido los dif'eientes mecanisinos utilizados por los programadores
para controlar la complejidad Entre todos ellos destaca la abstracciiz Como
describe Wulft: Los humanos hemos desarrollado una tcnica excepcionaliliente potente paia tratar la complejidad: abstraernos de ella. Incapaces de
dominar en su totalidad los objetos complejos, se igiioia los detalles no esenciales, tratando en su lugar con el modelo ideal del objeto y centrndonos en el
estudio de sus aspectos esenciales
En esencia, lu abstracciiz es la capacidad para encaprulai y aislar la iizforinaciiz del direizo y ejecucin En otro sentido, las tcnicas orientadas a objetos se
ve como iesultado de una larga progiesin histrica que comienza en los procedimientos y sigue en los mdulos, tipos abstractos de datos y objetos,

1..5.1.. La abstraccin como proceso natural mental


Las personas noiinalmente comprenden el mundo construyendo modelos mentales de partes del mismo; tratan de comprender cosas con las que pueden
interactuar: un modelo mental es una vista siinplificada de cmo funciona de
modo que se pueda inteiactuar contra ella En esencia, este proceso de construccin de modelos es lo mismo que el diseo de software, aunque el desarrollo de software es nico: el diseo de software produce el modelo que puede ser
manipulado poi una computadora
Sin embargo, los modelos mentales deben ser ms sencillos que el sistema al
cual imitan, o en caso contrario sern intiles. Por ejemplo, consideremos un
mapa como un modelo de su territorio A fin de ser til, el mapa debe ser ms
sencillo que el territorio que modela Un mapa nos ayuda, ya que abstrae slo

E l desarrollo de software

11

aquellas caracteisticas del territorio que deseamos modelar Un mapa de carreteras modela cmo conducir mejor de una posicin a otra Un mapa topogrfico modela el contorno de un territorio, quiz para planear un sistema de
largos paseos o caminatas
De igual forma que uii mapa debe ser ms pequeo significativamente que
su territorio e incluye slo informacin seleccionada cuidadosamente, as los
modelos mentales abstraen esas caractersticas de un sistema requerido para
nuestra comprensin, mientias ignoian caractersticas irrelevantes Este proceso de abstracciiz es psicolgicarneiite necesario y natural: la abstraccin es
crucial para comprender este complejo inundo,
L.a abstraccin es esencial para el funcionamiento de una mente humana
normal y es una herramienta muy potente para tratar la complejidad Considerar, por ejemplo, el ejercicio mental de memorizar nmeros. Un total de siete
dgitos se puede memorizar con ms o menos facilidad Sin embargo, si se
agrupan y se deiioininan nmeios de telfono, los dgitos individuales se relegan en sus detalles de ms bajo nivel, crendose un nivel abstracto y ms alto,
en el que los siete nmeros se organizan en una nica entidad Utilizando este
mecanismo se pueden memorizar algunos nmeros de telfonos, de modo que
la agrupacin de diferentes entidades conceptuales es un mecanismo potente al
seivicio de la abstiaccin

1..5.2.. Historia de la abstraccin del software


L.a abstraccin es la clave para disear buen software En los primeros dias de
la informtica, los programadores enviaban instrucciones binarias a una computadora, manipulando directamente interrupciones en sus paneles fiontales Los
ileinotcnicos del lenguaje ensamblados eran abstracciones diseadas para evitar que los programadores tuvieran que recordar las secuencias de bits que
componen las instrucciones de un programa El siguiente nivel de abstracciii
se consigue agrupando instrucciones primitivas paia formar macroinstrucciones
Por ejemplo, un conjunto se puede definir por abstraccin como una coleccin no ordenada de elementos en el que no existen duplicados Utilizando esta
definicin, se pueden especificar si sus elementos se almacenan en un array, una
lista enlazada o cualquier otia estructura de datos Un coi~juntode instrucciones realizadas por un usuario se pueden invocar por una macroinstiuccin; una
macioinstruccin instruye a la mquina para que realice inuchas cosas Tras los
lenguajes de prograiiiacin ensambladores aparecieron los lenguajes de prog~amacin de alto nivel, que supusieron un nuevo nivel de abstraccin Los lenguajes de programacin de alto nivel permitieron a los programadores distanciarse de las interioridades arquitectnicas especficas de una mquina dada,
Cada instiuccin en un lenguaje de alto nivel puede iiivocai varias instrucciones mquina, dependiendo de la mquina especfica donde se compila el programa Esta abstraccin permita a los programadores escribir software pala
propsito genrico, sin preocuparse sobre que mquina corre el programa
Secuencias de sentencias de lenguajes de alto nivel se pueden agrupar en
procedimientos y se invocan por una sentencia La programaci6n estructurada

12

Programacin orjentada a objetos

alienta el uso de abstracciones de contiol, tales como bucles o sentencias if-then,


que se han incorporado en lenguajes de alto nivel Estas sentencias de control
permitieron a los programadores abstraer las condiciones comunes para cambiar la secuencia de ejecucin
El proceso de abstraccin fue evolucionando desde la aparicin de los primeros lenguajes de programacin El mtodo ms idneo para controlar la
complejidad fue aumentar los niveles de abstraccin En esencia, la abstraccin
supone la capacidad de encapsular y aislar la informacin del diseo y ejecucin En un determinado sentido, las tcnicas orientadas a objetos pueden verse
como un producto natural de una larga progresin histrica, que va desde las
estructuras de control, pasando por los procedimientos, los mdulos, los tipos
abstractos de datos y los objetos
En las siguientes secciones describiremos los mecanismos de abstraccin
que han conducido al desarrollo profundo de los objetos: procedimientos, mdulos, tipos abstractos de datos y objetos

1.5..3. Procedimientos
Los procedimientos y funciones fueron uno de los primeros mecanismos de
abstracciu que se utilizaron ampliamente en lenguajes de programacin Los
procedimientos permitan tareas que se ejecutaban rpidamente, o eran ejecutadas slo con ligeras variaciones, que se reunan en una entidad y se reutilizaban, en lugar de duplica1 el cdigo varias veces Por otra parte, el procedimiento proporcion la primera posibilidad de ocultacin de ilzfolmacin Un
programador poda escribii un procedimiento o conjunto de procedimientos
que se utilizaban por otros programadores Estos otros programadores no
necesitaban conoce1 con exactitud los detalles de la implementacin; slo necesitaban el interfaz necesaiio. Sin embargo, los procedimientos no resolvan
todos los problemas En particular, no era un inecanismo efectivo para ocultar
la informacin y pala resolver el problema que se produca al trabajar mltiples piogramadores con nombres idnticos
Para ilustra1 el problema, consideremos un programador que debe escribir
un conjunto de rutinas para implementar una pila Siguiendo los criterios clsicos de diseno de software, nuestro programador establece en primer lugar el
interfaz visible a su trabajo, es decir cuatio rutinas: meter,sacar,pilavaca
y pilallena A continuacin iinplementa los datos mediante arrays, listas
enlazadas, etc Naturalmente, los datos contenidos en la pila no se pueden
hacer locales a cualquiera de las cuatro rutinas, ya que se deben compartir por
todos. Siil embargo, si las nicas elecciones posibles son variables locales o
globales, entonces la pila se debe mantener en variables globales: por el contrario, al se1 las variables globales, no existe un mtodo para limitar la accesibilidad o visibilidad de dichas variables Por ejemplo, si la pila se representa
mediante un array denominado datospila,este dato debe ser conocido por
otros programadores, que puedan desear crear variables utilizando el mismo
nombre pero relativo a las referidas rutinas De modo similar, las rutinas citadas estn reservadas y no se pueden utilizar en otras paites del programa para

El desarrollo de sotware

13

otros piopsitos En Pascal existe el mbito local y global Cualquier mbito


que permite acceso a los cuatro procedimientos debe permitir tambin el acceso
a sus datos comunes Para iesolver este problema se ha desarrollado un mecanismo de estructuracin diferente

1.,5..4. Mdulos
Un mdulo es una tcnica que proporciona la posibilidad de dividir sus datos y
procedimientos en una parte privada -slo accesible dentro del mdulo- y
pai te pblica -accesible fuera del mdulo- Los tipos, datos (variables) y
procedimientos se pueden definir en cualquier parte,
El criterio a seguii en la construccin de un indulo es que si iio se necesita
algn tipo de informacin, no se debe tener acceso a ella Este criterio es la
ocultaciiz de infornzaciiz
Los mdulos resuelven algunos problemas, pero no todos los problemas del
desarrollo de software Por ejemplo, los mdulos permitirn a nuestros programadores ocultar los detalles de la implementacin de su pila, pero qu sucede
si otros usuarios desean tener dos o ms pilas? Supongamos que un programador ha desarrollado un tipo de dato Complejo (representacin de un nmero
complejo) y ha definido las operaciones aritmticas sobre nmeros complejos
-suma, resta, multiplicacin y divisin; asimismo ha definido rutinas para
convertir nmeros convencionales a complejos Se presenta un problema: slo
puede manipular un nmero complejo El sistema de nmeros complejos no
ser til con esta restriccin, pero es la situacin en que se encuentra el programador con mdulos simples
Los mdulos pioporcionan un mtodo efectivo de ocultacin de la informacin, pero no permiten realizar irzstaizciacin, que es la capacidad de hacer
mltiples copias de las zonas de datos

1.5.5.. Tipos abstractos de datos


Un tipo abstiacto de datos (TAD) es un tipo de dato definido poi el programador que se puede manipular de un modo similai a los tipos de datos definidos
por el sistema Al igual que los tipos definidos por el sistema, un tipo de dato
abstr.acto corresponde a un conjunto (puede ser de tamao indefinido) de valores legales de datos y un nmero de operaciones primitivas que se pueden
realizar sobre esos valores Los usuarios pueden crear variables con valores que
estn en el rango de valores legales y pueda operar sobre esos valores utilizando las operaciones definidas Por ejemplo, en el caso de la pila ya citada se
puede definir dicha pila como un tipo abstracto de datos y las operaciones
sobre la pila como las nicas operaciones legales que estn permitidas para ser
realizadas sobre instancias de la pila
Los mdulos se utilizan frecuentemente como una tcnica de implementacin para tipos abstractos de datos, y el tipo abstracto de datos es un concepto
ms terico Para construir un tipo abstracto de datos se debe poder:

14

Programacion

1
2

3
4

El desarrollo de software

orrentada a objetos

Exponei una definicin del tipo


Hacer disponible un conjunto de operaciones que se puedan utilizar
para manipular instancias de ese tipo
Protegei los datos asociados con el tipo de modo que slo se pueda
actuar sobre ellas con las rutinas proporcionadas
Hacei instancias mltiples del tipo

Los mdulos son mecanisinos de ocultacin de informacin y no cumplen


bsicamente ms que los apartados 2 y 1 Los tipos abstractos de datos se
implementan con iiidulos en Modula-2 y paquetes en CL.U o Ada

1.,5..6. Objetos
Uii objeto es sencillamente un tipo abstracto de datos al que se aaden importantes innovaciones en comparticin de cdigo y reutilizacin L.os mecanismos
bsicos de orientacin a objetos son: objetos, ineizsujes y iiztodos, clases e iizstaizcias y heieiiciu

Conceptos clave

I
I
Abstraccin

Encapsulacin

Polimotiismo

Persistencia

Genericidad

L.a pei ti~teizciase refiere a la permanencia de un objeto, esto es, la cantidad


de tiempo para el cual se asigna espacio y permanece accesible en la memoiia
del computador

1.6. U N NUEVO PARADIGMA DE PROGRAMACION


La piogiaiizaciiz oiientada a objetos (POO)* se suele conocer como un nuevo
paradigiiza de programacin Otros paradigmas conocidos son: el paiadigiiza de
la prog~aiizaciiziiizpeiativa (con lenguajes tales como Pascal o C), el paiadigiiia
de la prograiilacin lgica (PROLOG) y el paiadigiiza de la progiaiiiaciiz fuizcioiza1 (Lisp) El significado de paiadigiizu3 (paradigiiza en latn; paradeigiiza e11
griego) en su oiigen significaba un ejemplo ilustrativo, en particular enunciado
modelo que mostraba todas las inflexiones de una palabra En el libro Tlie
St~u(tu1eo j Scieiztzfic Revolutioizs, el historiador Thomas Kuhn4 describa un
paradigma como un conjunto de teoras, estndar y mtodos que juntos representan un medio de organizacin del conocimiento: es decir, u11 medio de
visualizar el mundo En este sentido, la piogramacin orientada a objetos es un
nuevo paradigma La orientacin a objetos berza a reconsideiar nuestro peiisamiento sobre la computacin, sobre lo que significa realizar computacin y
sobre cmo se estructura la informacin dentio del computador5
Jenkins y Glasgow observan que la mayoia de los programadores trabajan en un lenguaje y utilizan slo un estilo de programacin Ellos programan
en un paradigma forzado por el lenguaje que utilizan Con frecuencia, no se
enfrentan a mtodos alternativos de resolucin de un problema, y por consiguiente tienen dificultad en ver la ventaja de elegir un estilo ms apropiado al
problema a manejai Bobrow y Stefik definen un estilo de programacin como
un medio de organizacin de piogramas sobre la base de algn modeloconceptual de programacin y un lenguaje apiopiado pala hacer programas en un
estilo claro Sugieren que existen cuatro clases de estilos de programacin:
Orientados
Orientados
Oiientados
Orientados

Entidades bsicas
Mtodos

Instancias

Jerarqua

Figura 1 . 3 Principios bsicos de la orientacin a objetos

Una idea fundamental es la coinunicacin de los objetos a travs de paso de


iizeizsajes Adems de esta idea, se aaden los mecanismos de heienciu. 11 polimorfisiizo L.a herencia peimite diferentes tipos de datos para compartir el mismo
cdigo, peimitiendo una reduccin en el tamao del cdigo y un incremento en
la funcionalidad El polimorfismo permite que un mismo mensaje pueda actuar
sobre objetos diferentes y comportarse de modo distinto

15

a
a
a
a

procedimientos
objetos
lgica
reglas

Algoritmos
Clases 11 objetos
Expre~adoeiz clculo de piedicadf~r
Reglas if-then

No existe ningn estilo de progiainacin idneo para todas las clases de


programacin La orientacin a objetos se acopla a la simulacin de situaciones del mundo real
En POO, las entidades centrales son los objetos, que son tipos de datos que
encapsulan con el mismo nombie estructuras de datos y las opeiaciones o
algoritmos que maiiipulan esos datos

'
'

Un ejemplo que sirve como modelo o patrn: Dicrioiiai.)i o/ S<ieitce aiid leiliizoloq> Acadeinic
Press, 1992
KUHIV,Thomas S : The Stiucfure o/ S<icizt$i Reooiuiioii 2 " e d , Uiiiversity of Cliicaga Press
Chicago, 19'70.
Object-Oriented Programming (OOP)

16

El desarrollo de software

Programacion orientada a objetos

1.7.. ORlENTAClON A OBJETOS


L.a orientacin a objetos puede describiise como el conjunto de dircipliizas (ingeizielia) que derari,ollail y iizodelizaiz softivare que facilitan la construccin de
sisteiizay cori~plejosa pal tii de coinpoizeiztes
El atractivo intuitivo de la orientacin a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea posible Las ventajas de la orientacin a objetos son muchas en
programacin y modelacin de datos Como apuntaban Ledbetter y Cox (1985):
La programacin orientada a objetos permite una representacin ms directa
del modelo de inundo tea1 en el cdigo El resultado es que la transformacin
radical noimal de los requisitos del sistema (definido en trminos de usuario) a la
especificacin del sistema (definido en trminos de coinputador) se reduce consideiablemente
La Figura 1 4 ilustra el problema Utilizando tcnicas convencionales, el
cdigo generado para un problema de mundo real consta de una primera
codificacin del problema y a continuacin la transformacin del problema en
trminos de un lenguaje de coinputador Von Newmann Las disciplinas y tcnicas orientadas a objetos manipulan la transformacin autornticamente, de
inodo que el volumeil de cdigo codifica el problema y la transformacin se
minimiza. De hecho, cuando se compara con estilos de programacin convencionales (plocediiizerztales por procedinzie~ztor),las reducciones de cdigo van
desde un 40 por 100 hasta un orden de magnitud elevado cuando se adopta un
estilo de piogiamacin orientado a objetos.
Los conceptos y herramientas orientados a objetos son tecnologas que
permiten que los problemas del inundo real sean expresados de modo fcil y

f1--

1-

Transformacin de "017 Newrnan

17

natural L.as tcnicas orientadas a objetos proporcionan mejoras y metodologa~para construir sistemas de software complejos a partir de unidades de
software modularizado y reutilizable
Se necesita un nuevo enfoque para construir software en la actualidad Este
nuevo enfoque debe ser capaz de manipular tanto sistemas grandes como pequeos y debe crear sistemas fiables que sean flexibles, mantenibles y capaces
de evolucionar para cumplir las necesidades de cambio
L.a tecnologa orientada a objetos puede cubrir estos cambios y algunos
otros ms en el futuro
La orientacin a objetos trata de cumplir las necesidades de los usuarios
finales, as como las propias de los desarrolladores de pioductos software. Estas
tareas se iealizan mediante la modelizacin del mundo real El soporte fundamental es el modelo objeto Los cuatro elementos (propiedades) ms importantes de este modelo6 son:
Abstraccin
Encapsulacin
Modularidad
Jerarqua
Como sugiere Booch, si alguno de estos elementos no existe, se dice que el
modelo no es orientado a objetos

1..7.1. Abstraccin
La abstraccin es uno de los medios ms importantes, mediante el cual nos
enfrentamos con la complejidad inherente al software La abstraccin es la
propiedad que permite representar las caracteisticas esenciales de un objeto,
sin preocupaise de las restantes caracteisticas (no esenciales)
Una abstiaccin se centia en la vista externa de un objeto, de modo que
sirva para separar el comportamiento esencial de un objeto de su implementacin Definir una abstraccin significa describir una entidad del mundo real, no
importa lo compleja que pueda ser, y a continuacin utilizar esta descripcin en
un programa
El elemento clave de la programacin orientada a objetos es la clase Una
clase se puede definir como una descripcin abstracta de un grupo de objetos,
cada uno de los cuales se diferencia por su estado especifico y por la posibilidad
de realizar una serie de operacioizer Por ejemplo, una pluma estilogrfica es un
obieto que tiene un estado (llena de tinta o vacia) v sobre la cual se vueden
realizar algunas ~ ~ e r a c i o n e s ' ( ~ejemplo
or
escribir, piner o quitar el capuchn,
llenar de tinta si est vaca)
La idea de escribir programas definiendo una serie de abstracciones no es
nueva, pero el uso de clases para gestionar dichas abstracciones en lenguajes de
programacin ha facilitado consideiablemente su aplicacin

Codificacin del programa

Figura 1 . 4 Construccin de software,

Booc~;Giady: Objert-Oiientcd
1994

Arzalysis and Deiiyn with 4pplications

Benjainin/Cumrnings,

18

Programacion orientada a objetos

El desarrollo de soiware

19

1.,7..2. Encapsulacin
La eiicapsulaciii o eiicap~ulaiizieiitoes la propiedad que permite asegurar que el
contenido de la informacin de un objeto est oculta al mundo exterior: el
objeto A no conoce lo que hace el objeto B, y viceversa L.a encapsulacin
(tambin se conoce conlo otultaciiz de la iifoii~zuciiz),en esencia, es el proceso
de ocultar todos los secretos de un objeto que no contribuyeri a sus caractersticas esenciales
L.a encapsulacin permite la divisin de un prograina en mdulos Estos
n~dulosse implementan mediante clases, de foima que una clase representa la
encapsulacin de una abstraccin En la prctica, esto significa que cada clase
debe tener dos partes: un interfaz y una implementaciii El iizterfaz de una
clase captura slo su vista externa y la iiizplei?zeizzacincontiene la representacin de la abstraccin, as como los iilecaiiismos que realizan el comportamiento deseado

L,asje~arquasde generalizacin/especializacin se conocen como herencia


Bsicamente, la herencia define una relacin entre clases, en donde una clase
comparte la estructura o compoitamiento definido en una o ms clases (hereizcia sii~zpley hereizcia iizltiple, respectivamente).
L.a agregacin es el concepto que permite el agrupamiento fsico de estructuras relacionadas lgicamente As, un camin se compone de ruedas, rnotoi,
sistema de transmisin y chasis; en consecuencia, camin es una agregacin, y
ruedas, motor, transmisin y chasis son agregados de camin

1.7.5. Polimorfismo
1.7.3. Modularidad
L,a modularidad es la propiedad que permite subdividii una aplicacin
en partes ms pequeas (llamadas nzdulos), cada una las cuales debe ser
tan independiente como sea posible de la aplicacin en s y de las restantes
partes
La modulaiizacin, como indica Liskov, consiste en dividir un programa en
mdulos que se puedan compilar por separado, pero que tienen conexiones con
otros mdulos Al igual que la encapsulacin, los lenguajes soportan la modularidad de diversas formas. Por ejemplo, en C + + los mdulos son archivos
compilados poi separado L.a prctica usual (se ver en el Captulo 2) es situar
los inteifaces de los mdulos en archivos con nombres con extensin , h (aiclzivos de cabecera) y las implementacioiies de los mdulos se sitan en archivos
con nombres con extensin cpp
En Ada, el mdulo se define como paquete (package) Un paquete tiene dos
partes: la espec@cacin del paquete y el cuerpo del paquete; tambin se pueden
compilar por separado
Como se ver en el Captulo 2, la i~zodulaiidod es la propiedad de un sistema
que peiinite su descomposicin en un conjunto de indulos cohesivos y dbilmente acoplados

1.7.4. Jerarqua
L.a jeiarqua es una propiedad que pei~niteuna ordenacin de las abstracciones L.as dos jerarquas ms importantes de un sistema complejo son: est~uctura
de clases (jerarqua es-un>>(iy-a): genetalizaciii/especializacin) y estructura
de objetos (jerarqua parte-de (part-of): agiegacin)

La quinta propiedad significativa de los leiiguajes de programacin orientados


a objetos es el poliiizorfisino Esta propiedad no suele ser considerada como
fundamental en los diferentes modelos de objetos propuestos, pero, dada su
importancia, no tiene sentido considera1 un objeto nzodelo que no soporte esta
propiedad,
Polimo~fismoes la propiedad que indica, literalmente, la posibilidad de que
una entidad tome rnuclzar foriizar En triiiinos prcticos, el polimorfismo permite iefeiirse a objetos de clases diferentes mediante el mismo elemento de
programa y realizar la misma opeiacin de diferentes formas, segn sea el
objeto que se referencia en ese momento
Por ejemplo, cuando se desciibe la clase rilainjel.os se puede observar que la
operacin coiizer es una operacin fundamental en la vida de los mamferos, de
modo que cada tipo de mamfero debe poder realizar la operacin o funciii
corizei Por otra parte, una vaca o una cabra que pastan en un campo, un nio
que se come un bombn o caramelo y un len que devora a otro animal, son
diferentes formas que utilizan los distintos mamferos para realizar la misma
funcin (conzel.).
El polimorfismo implica la posibilidad de tomar un objeto de un tipo
(mamfero, por ejemplo) e indicarle que ejecute conzer; esta accin se ejecutar
de diferente foima, segn sea el objeto mamfero sobre el que se aplica
Clases, herencia y polimorfismo son aspectos claves en la programacin
orientada a objetos, y se reconocen a estos elementos como esenciales en la
orientaciiz a objetos El polimorfismo adquiere su mxima expresin en la
del ivacin o exteizsiiz de clases, es decir, cuando se obtiene una clase a partii de
una clase ya existente, mediante la propiedad de derivacin de clases o herencia As, por ejemplo, si se dispone de una figura que represente figuras genricas, se puede enviar cualquier mensaje, tanto a un tipo derivado (elipse, crculo,
cuadrado, etc) como al tipo base Por ejemplo, una clase,figuia puede acepta1
los mensajes dibujar, bor~ary nzover Cualquier tipo derivado de una figura es
un tipo de figura y puede recibir el inirino mensaje Cuando se enva un mensaje,

20

El desarrollo d e soffware

Programacrn orientada a objetos

por ejemplo dibujar, esta tarea ser distinta segn que la clase sea un tringulo,
un cuadrado o una elipse Esta propiedad es el polimorfismo, que permite que
una misma funcin se comporte de diferente forma segn sea la clase sobre la
que se aplica La funcin dibujar se aplica igualmente a un crculo, a un cuadrado o a un tringulo, y el objeto ejecutar el cdigo apropiado dependiendo del
tipo especifico
El polimorfismo requiere ligadura tardia o postergada (tambin llamada
dinmica), y esto slo se puede producir en lenguajes de programacin orientados a objetos Los lenguajes no orientados a objetos soportan ligadura temprana o anterior; esto significa que el compilador genera una llamada a un nombre
especfico de funcin y el enlazador (linker) resuelve la llamada a la direccin
absoluta del cdigo que se ha de ejecutar En POO, el programa no puede
determinar la direccin del cdigo hasta el momento de la ejecucin; para
resolver este concepto, los lenguajes orientados a objetos utilizan el concepto
de ligadura tardia Cuando se envfa un mensaje a un objeto, el cdigo que se
llama no se determina hasta el momento de la ejecucin El compilador asegura
que la funcin existe y realiza ve~ificacinde tipos de los argumentos y del
valor de retorno, pero no conoce el cdigo exacto a ejecutar
Para realizar la ligadura tardia, el compilador inserta un segmento especial
de cdigo en lugar de la llamada absoluta Este cdigo calcula la direccin del
cuerpo de la funcin para ejecutar en tiempo de ejecucin utilizando informacin almacenada en el propio objeto Por consiguiente, cada objeto se puede
comportar de modo diferente de acuerdo al contenido de ese puntero Cuando
se enva un mensaje a un objeto, ste sabe qu ha de hacer con ese mensaje

1.7.6.. Otras propiedades


El modelo objeto ideal no slo tiene las propiedades anteriormente citadas al
principio del apartado, sino que es conveniente que soporte, adems, estas otras
propiedades:

Concurrencia (multitarea)
Per sistencia
Geizer icidad
Manejo de excepciones
Muchos lenguajes soportan todas estas propiedades y otros slo algunas de
ellas As, por ejemplo, Ada soporta concurrencia y Ada y C + + soportan
genericidad y manejo de excepciones La persistencia o propiedad de que las
variables -y por extensin a los objetos- existan entre las invocaciones de un
programa es posiblemente la propiedad menos implantada en los L P O 0 7 ,
aunque ya es posible considerar la persistencia en lenguajes tales como Smalltalk
y C i , lo que facilitar el advenimiento de las bases de datos orientadas a objetos, como as est sucediendo en esta segunda mitad de la dcada de los noventa,

' Lenguaje de Programacin Orientado a Objetos

21

1.8. REUTlLlZAClON DE SOFTWARE


Cuando se construye un automvil, un edificio o uii dispositivo electinico, se
ensamblan una serie de piezas independientes, de modo que estos componentes
se reutilicen, en vez de fabricarlos cada vez que se necesita construir un automvil o un edificio En la construccin de software, esta pregunta es continua Por
qu no se utilizan programas ya construidos para formar programas ms grandes? Es decir, si en electrnica los computadores y sus perifricos se forman
esencialmente con el ensamblado de circuitos integrados, jexiste algn mtodo
que permita realizar grandes programas a partir de la utilizacin de otros
programas ya realizados? Es posible reutilizar estos componentes de software?
L.as tcnicas orientadas a objetos proporcioiian un mecanismo para construir cornporzentes de rofrware reutilizables que posterioimente puedan ser inteiconectados entre s y formar grandes proyectos de software8
En los sistemas de programacin tradicionales, y en particular en los basados en lenguajes de programacin estructuiadas (tales como FORTRAN,
C, etc ), existen las bibliotecas de funciones, que contienen funciones (o procedimientos, segn el lenguaje) que pueden ser incorporados en diferentes programas En sistemas orientados a objetos se pueden constiuir componentes de
software reutilizables, al estilo de las bibliotecas de funciones, normalmente
denominados bibliotecas de softivare o paquetes de softivare reutilizables Ejemplos de componentes reutilizables comercialmente disponibles son: 'Turbo Visin de Turbo Pascal 0L.E 2.0 de C + + , jerarqua de clases Smalltalk, clases
MacApp para desarrollo de interfaces grficos de usuario en Object Pascal,
disponibles en Apple, la coleccin de clases de Objective-C, etc.
En el futuro inmediato, los ingenieros de software dispondrn de catlogos
de paquetes de software reutilizable, al igual que sucede con los catlogos de
circuitos integrados electrnicos, como les ocurie a los ingenieros de hardware
Las tcnicas orientadas a objetos ofrecen una alternativa de escribir el mismo programa una y otra vez El programador orientado a objetos modifica una
funcionalidad del programa sustituyendo elementos antiguos u objetos por
nuevos objetos, o bien conectando simplemente nuevos obietos en la aplicacin
La reutilizacin de cdigo en reprogramacin tradicional se puede realiza1
copiando y editando, mientras que en programacin orientada a objetos se
puede reutilizar el cdigo, creando automticamente una subclase y anulando
alguno de sus mtodos
Muchos lenguajes orientados a objetos fomentan la reutilizacin mediante
el uso de bibliotecas iobustas de clases preconstruidas, as como otias herramientas, como hojeadores (broivse~),para localizar clases de intesks y depuradores interactivos para ayudar al programador
BRADCOX, en su ya clsico libro Objecr-Oiieilted Piograi>irniiig An Eoo1utioiiai.v Approa~lf
[Con, Novobilski, 911, acu el trmino chip de rqftiuaie (Software-IC), o ioinpoiienter de software
para definir las clases de objetos como componentes de software reutilizables Existe versin en
espaol de Addisoii-Wesley/Daz de Santos, 1993, con el ttulo Prograrnacibri oiiei~tadaa objetor
Uii eif<,yue evolurivo

22

El desarrollo de software

Programacion orientada a objetos

1..9.. LENGUAJES DE PROGRAMACION ORIENTADOS


A OBJETOS
El priinei lenguaje de progiamacin que introdujo el concepto de clase fue
Simula-67, como entidad que contena datos y las operaciones que maiiipulaban los datos Asimisino, introdujo tambin el concepto de herencia
El siguiente lenguaje orientado a objetos, y seguramente el ms popular
desde un enfoque conceptual exclusivamente de objetos, es Sinalltalk, cuya
primera versin comercial se desarroll en 1976, y en 1980 se populariz con la
aparicin de Smalltalk-80. Posteiiormente se ha populaiizado gracias al desarrollo de Smalltalk/V de la casa Digital Y, que iecientemente se lid implementado bajo entorno Windows El lenguaje se caracteriza por soportar todas las
propiedades fundamentales de la orientacin a objetos, dentro de un entorno
integrado de desarrollo, con interfaz interactivo de usuario basado en mens
Entre los lenguajes orientados a objetos que se han desarrollado a partir de
los ochenta destacan extensiones de lenguajes tradicionales tales como C + + y
Objective-C (extensiones de C), Modula-2 y Object Pascal (extensin de Pascal)
y recientemente Object Cobol, que a lo largo de 1994 han aparecido sus primeras
veisiones comeiciales, y lava, el nuevo lenguaje para programaciii en Internet.
Otro lenguaje orientado a objetos puros es Eiffel, creado por Bertrand
Meyer y que soporta todas las propiedades fundamentales de objetos Hasta
ahora no ha adquirido popularidad ms que eii ambientes universitarios y de
investigacin Sin embargo, la prevista aparicin para el ao 1995 de la versin 3, que coirer bajo Windows, segurameilte aumentar su difusin
Ada ha sido tambin un lenguaje -en este caso basado en objetos- que
sopoita la mayora de las propiedades orientadas a objetos Sin embargo, la
nueva veisin Ada-95 ya soporta herencia y polimorfismo

23

Eii los ltinios aos han aparecido lenguajes con soporte de objetos que
cada vez se estn popularizando ms: Clipper 5-2, Visual BASIC, etc,
De cualquier forma, existe un Yey actual en los lenguajes oiientados a objetos: C + + La normalizacin por ANSI y AT&T de la versin 3 O y las numerosas versiones de difeientes fabricantes, tales como Borland C + + 4 014 5, Turbo
C + + 3 011 1 y 4 5, Microsoft C/C+ + 7 0, Visual C + + 1 512, Symantec 6 017 0,
etctera, hacen que en la seguilda mitad de los noventa ser el lenguaje orientado a objetos ms popular y utilizado en el mundo de la programacin
L.a evolucin de los lenguajes orientados a objetos se han mostrado en la
Figura 15, en la que se aprecia el tronco comn a todos los lenguajes modeinos
Algol y las tres lneas fundamentales: enfoque en Pascal (Ada, Object Pascal),
enfoque pulo de orientacin a objetos (Simula/Smalltalk/Eiffel) y enfoque en C
(Objective-C, C + f , .Talla)

1.9.1.

Clasificacin de los lenguajes orientados a objetos

Existen varias clasificaciones de lenguajes de programacin orientados a objetos, atendiendo a criterios de construccin o caractersticas especficas de los
mismos Una clasificacii~ampliamente aceptada y difundida e s la dada poi
Wegner y que se ilustra en la Figura 1 69

en objetos

+clases
\

Algol

1 "---

\\\
/
1
Simula

Orientados
a objetos

CLU

Pascal
'
X

\/

/
Smalltalk

Objet Pascal

Ada

Actor

objective.c

c++

v
Ada-95
'E~i:!a~d
Pascal
Java

Figura 1 5

BASlC

Figura 1 6

1.a clasificacin de Wegnei divide los lenguajes en tres categoras:

Visual BASlC 3

i 4
Visual BASlC

Evolucin de los lenguajes orientados a objetos,

Clasificacin de lenguajes 00 de Wegner

Lenguajes basados en objetos que soportan objetos Es decir, disponen


de componentes caracterizados por un coi~juntode operaciones (coinportamiento) y un estado
Lenguajes basados en clases que implican objetos y clases Es decir,
disponen de componentes tipo clase con operaciones y estado coinii

WEGNEK,Petel [1987]: Di~iieiisioiiso j Objecr-Baied Laiiguajer Desigii Nmero especial de


SIGPLAN Noti~ev

24

El desarrollo de soffware

Programacin orientada a objetos

Una clase de un objeto se construye con un iizte?faz que especifica las


operaciones posibles y unecuerpo que implementa dichas operaciones
Lenguajes orientados a objetos que adems de objetos y clases ofrecen
mecanismos de herencia entre clases Esto es, la posibilidad de derivar
operaciones y atributos de una clase (superclase) a sus subclases

La definicin anterior, pese a su antigedad, sigue teniendo vigencia Existen


otias clasificaciones similares, pero con la inclusin de la propiedad de polinzorfisino en la categora 1, como requisito para ser lenguaje orientado a objetos
De cualquier forma, hoy en da es posible ampliar esa clasificacin de acuerdo a criterios puramente tciiicos y hacer una nueva clasificacin de la categora 3:

31

Lenguajes orieiztados a objetos puros Soportan en su totalidad el paradigma de orientacin a objetos:


Smalltalk

32

Eiffel

Simula

Lenguajes oiientados a objetos hibridos Soportan en su totalidad el


paradigma de orientacin a objetos s o b ~ eun ncleo de lenguaje
hbrido:
C + + (exteizsiiz de C: Borland C + + , Microsoft C + + , Turbo C + + ,
Visual C + i , Symantec,Watcom )
Objective-C (exteizsiiz de C)
Object COBOL. (exteizsin de COBOL).
Object Pascal (extensin de Pascal: Turbo/Borland Pascal)
Visual Object (extensin de Clipper).
Delphi (extensiiz de Turbo Pascal 70)
Java (extensiiz de C + + y Ada-95)

Tabla 1 . , 1 Criterios de Meyer en lenguajes 00 y basados en objetos,,

Modularizacin
Tipos abstractos de datos
Gestin automtica de memoria
4 Slo clases
5 Herencia
6 Polirnoifismo (y ligadura dinmica )
'7 Herencia mltiole v reoetida
1
2
3

S
S

S
S

S
S

S
S

S
Si

S
S

S
S

S
S
S

E n parte
En paile
S

S
S
S

S
S
S

S
S
S

No

Si

S
S

No

S
S

No

No

No

No

De cualquier forma, Meyei, cieadoi del lenguaje Eiffel, proporciona unos


criterios para considerar la bondad" de un lenguaje orientado a objetos,
'O MEYER,
Bertrand: Objrct Oriei~tedSqfti4:aie Coitrtiuriioii Englewood Clifls NI, PrenticeHall, 1988

25

cuyos complementos configuran, de liecho, una nueva clasificacin En este


sentido, los criterios recogidos por este autor son los siguientes:

L.a modularizacin de los sistemas ha de realizarse mediante estructuras


de datos apropiadas.
2 Los objetos se describen como la implementacin de tipos abstractos de
datos
3 La memoria se gestiona (administra) automticamente
4 Existe una correspondencia entre tipos de datos no elementales y clases
5 Las clases se pueden definir como extensiones o restricciones de otras
clases ya existentes mediante herencia
6 Soportan polimorfismo y ligadura dinmica
7 Existe herencia mltiple y repetida
De acuerdo con los criteiios de Meyer, recogemos en IaTabla 1 1 el cumplimiento de dichos criterios en los lenguajes 00 y basados en objetos ms
populares

1..lo. DESARROLLO TRADICIONAL FRENTE A

ORIENTADO A OBJETOS
El sistema tradicional del desarrollo del software para un determinado sistema
es la subdivisin del mismo en mdulos, a la cual deben aplicarse criterios
especficos de descomposicin, los cuales se incluyen en metodologas de diseo Estos mdulos se refieren a la fase de construccin de un programa, que en
el modelo clsico sigue a la definicin de los requisitos (fase de anlisis),que se
muestra en la Figura 3 1
El modelo clsico del ciclo de vida del software n o es el nico modelo
posible, dado que es posible desarrolla1 cdigo de un modo evolutivo, por
refinamiento y prototipos sucesivos Existen numerosos lenguajes de programacin y metodologas que se han desarrollado en paralelo a los mismos, aunque
normalmente con independencia de ellos
En esta seccin nos centraremos en la metodologa ms utilizada, denominada desarrollo estructurado, que se apoya esencialmente en el diseo desceizdente y en la progiamacin estructul.ada
La progiamacin estructurada es un estilo disciplinado de programacin segn los lenguajes procedimentales (por procedimientos), tales como
FORTRAN, BASIC, COBOL y recientemente C y C++
Las metodologias disetio descendente (o descomposicin funcional) se centran en operaciones y tienden a descuidar la importancia de las esrtructuras de
datos Se basan en la dlebre ecuacin de Wirth:
Datos

+ Algoritnzos = Programar

La idea clave del diseo descendente es rompe1 un programa grande en


tareas ms pequeas, ms manejables Si una de estas tareas es demasiado
grande, se divide en tareas ms pequeas Se contina con este proceso hasta

26

Programacion or~entadaa obletos

que el programa se compartimentaliza en mdulos ms pequeos y que se


programan fcilmente Los subprogramas facilitan el enfoque estructurado, y
en el caso de lenguajes como C, estas unidades de programas, llamadasfunciones, representan las citadas tareas o mdulos individuales Las tcnicas de
progiamacin estructuradas reflejan, en esencia, un modo de resolver un prograina en trminos de las acciones que realiza
Para comprender mejor las relaciones entre los algoritmos (funcioiles) y los
datos, consideremos una comparacin con el lenguaje natural (por ejemplo
espaol o ingls), que se compone de muchos elementos pero que ieflejar poca
expresividad si slo se utilizan nombres y verbos Una metodologa que se basa
slo en datos o slo eiz pi.ocedi~izieiztoses similar a un lenguaje (idnea) en el que
slo se utilizan nombres o veibos. Slo enlazando nombres o verbos correctos
(siguiendo las reglas sen~nticas),las expresiones tomarn formas inteligibles y
su proceso ser ms fcil
L.as metodologias tradicionales se vuelven poco prcticas cuando han de
aplicaise a proyectos de gran tamao El diseo orientado a objetos se apoya
en lenguajes orientados a objetos que se sustentan fundamentalmente en los
tipos de datos y opeiaciones que se pueden realizar sobre los tipos de datos
Los datos no fluyen abiertamente en un sistema, coino ocurre en las tcnicas
estructuradas, sino que estn piotegidos de n~odificacionesaccidentales En
piogramacin orientada a objetos, los mensajes (en vez de los datos) se mueven -por el sisteina En lugai del enfoque funcional (invocar una funcin con unos
datos), en un lenguaje orientado a objetos, se enva un mensaje a un objeto*
De acuerdo con Meyer, el diseo orientado a objetos es el mtodo que
conduce a arquitecturas de software basadas en objetos que cada sistema o
subsistema evala
Recordemos qu son los objetos? Un objeto es una entidad cuyo comportamiento se caracteriza por las acciones que realiza Con ms precisin, un objeto
se define como una entidad caracterizada por un estado; su comportamiento se
define por las operaciones que puede realizar; es una instancia de una clase; se
identifica por un nombre; tiene una visibilidad limitada para otros objetos; se
define el objeto mediante su especificacin y su implementacin
Una definicin muy elaborada se debe a Meyer: Diseo orientado a objetos es la construccin de sistemas de software como colecciones estructuradas
de impleinentaciones de tipos de datos abstractos n
La construccin de un sistema se suele realizar mediante el ensamblado
ascendente (abajo-ariiba) de clases preexistentes Las clases de un sistema pueden tener entie si, como se ver en los siguientes captulos, relaciones de uso
(cliente), relaciones de deiivacin (herencia) o relaciones de agregacin (conzposicin) o iiicluso slo relaciones de asociacin As, por ejemplo, con una ielacin de cliente, una clase puede utilizar los objetos de otra clase; con una
ielacin de herencia, una clu~epuede heredai. o derivar. sus propiedades definidas en otra clase
El haidwaie se ensambla a partii de componentes electrnicos, tales como
ciicuitos integrados (clips), que se pueden utilizar repetidamente para disear y
construir conjuntos mucho ms grandes, que son totalmente reutilizables La
calidad de cada nivel de diseo se asegura mediante componentes del sistema

El desarrollo de software

27

que han sido probados pieviamente a su utilizacin El ensamblado de componentes electinicos se garantiza mediante interfaces adecuados
Estos conceptos se aplican tambin con tecnologas de objetos Las clases
(tipos de objetos) son como los clzips de hu~divaie,Cox les llam chips de
softwuie, que no slo se pueden enlazar (ensamblar) entre s, sino que tambin
se pueden reutilizar (volver a utilizar), L.as clases se agiuparn normalmente
en bibliotecas de clases, que son componentes reutilizables, fcilmente legibles
En la actualidad existe gran cantidad de software convencional, en su
mayora escrito normalmente para resolver problemas especficos; por esta razn, a veces es ms fcil escribir nuevos sistemas que conveitir los existentes.
L.os objetos, al reflejar entidades del mundo real, permiten desarrollar aplicaciones, creando nuevas clases y eiisamblndolas con otras ya existentes
Normalmente, los desarrolladores experimentados gastan un porcentaje alto
de su tiempo (20 al 40 por 100) en cieai nuevas clases y el tiempo restante en
ensamblar componentes probados de sistemas, construyendo sistemas potentes
y fiables

1.11. BENEFICIOS DE LAS TECNOLOGIAS


DE OBJETOS (TO)
Una pregunta que hoy da se hacen muchos informticos es: Cul es la ~ a z n
pura introducir mtodos de TO en los procesos de desariollo? L.a principal razn,
sin lugar a dudas, son los beneficios de dichas TO: aumento de la fiabilidad y
productividad del desarrollador La fiabilidad se puede mejorar, debido a que
cada objeto es simplemente una caja negra con respecto a objetos externos
con los que debe comuiiicarse L.as estructuras de datos internos y mtodos se
pueden refina1 sin afecta1 a otras partes de un sistema (Fig 1 7 )
Objeto
//

Figura 1 7

Mtodos

El objeto como cala negra

L.os sistemas tradicionales, por otia parte, presentan con frecuencia efectos
laterales no deseados Las tecnologas de objetos ayudan a los desarrolladores
a trata1 la complejidad en el desariollo del sistema
La productividad del desairollador se puede mejorar, debido a que las clases
de objetos se pueden hacer reutilizables de modo que cada subclase o instancia
de un objeto puede utilizar el mismo cdigo de piograma para la clase Por
otra parte, esta productividad tambin aumenta, debido a que existe una asociacin ms natural entie objetos del sistema y objetos del mundo real

28

Ei

Programacin orientada a objetos

Programa

Programa

Datos

Figura 1 8 Proceso tradicional de datos,


Taylor " considera que los beneficios del modelado y desarrollo de objetos son:
1 Desarrollo ms rpido
2 Calidad ms alta
1 Mantenimiento ms fcil
4 Coste reducido
5 Incremento en escalabilidad
6 Mejores estructuras de informacin
7 Incremento de adaptabilidad
Sin embargo, TaylorL2tambin considera algunos inconvenientes, aunque
algunos de ellos ya han sido superados o al menos reducido su impacto
1 Inmadurez de la tecnologa (hoy da ya no se puede considerar aso
2 Necesidades de estndares (el giupo OMG es una realidad),
3 Necesidad de mejores herramientas
4 Velocidad de ejecucin
5 Disponibilidad de personal cualificado,
6 Coste de conversin,
7 Soporte para modularidad a gran escala
L.a Figura 19 muestra los beneficios genricos de las tecnologas de objetos

..

Reutilizacin Las clases se construyen a partir de otras clases


Sistemas ms fiables,
Proceso de desarrollo ms rpido
Desarrollo ms flexible
Modelos que reflejanmejor la realidad
Mejor independencia e interoperatividad de la tecnoiogia
Mejor informticadfstribuiday cliente-servidor,
Bibliotecas de clases comerciales disponibles
Mejor relaciones con los clientes
Mejora la calidad del producto software terminado
Figura 1.9. Beneficios de las tecnologias de objetos

" IAYLOR,
David A : Objet-Oriented Trchiioioqy Readirlg MA: Addison-Wesley, 1992, pginas 101-107
" Ibid pgs 108-113

desarrollo de soitware

29

RESUMEN
Este captulo es una introduccin a los mtodos de desarrollo orientados a
objetos Se comienza con una bieve revisin de los problemas encontrados en el
desarrollo tradicional de software que condujeron a la crisis del software y que
se han mantenido hasta los aos actuales El nuevo modelo de programacin se
apoya esencialmente en el concepto de objetos
La orientacin a objetos modela el mundo real de un modo ms fcil a la
perspectiva del usuario que el modelo tradicional La orientacin a objetos
proporciona mejores tcnicas y paradigmas para consttuir componentes de
software reutilizables y bibliotecas ampliables de mdulos de software Esta
caracterstica mejora la extensibilidad de los programas desarrollados a travs
de metodologas de orientacin orientada a objetos Los usuarios finales, programadores de sistemas y desarrolladores de aplicaciones se benefician de las
tecnologas de modelado y piogramacin orientadas a objetos
L.os conceptos fundamentales de orientacin a objetos son tipos abstractos
de datos, herencia e identidad de los objetos U n tipo abstracto de datos describe una coleccin con la misma estructura y comportamiento Los tipos abstractos de datos extienden la nocin de tipos de datos, ocultando la implementacin de operaciones definidas por el usuario (mensajes) asociados con los tipos
de datos Los tipos abstractos de datos se implementan a travs de clases Las
clases pueden heredar unas de otras Mediante la herencia se pueden construir
nuevos mdulos de software (tales como clases) en la parte superior de una
jerarqua existente de mdulos La herencia permite la comparticin de cdigo
(y por consiguiente reutilizacin) entre mdulos de software La identidad es la
propiedad de un objeto que diferencia cada objeto de los restantes Con la
identidad de un objeto, los objetos pueden contener o referirse a otros objetos
La identidad del objeto organiza los objetos del espacio del objeto inanipulado
por un programa orientado a objetos.
Este captulo examina el impacto de las tecnologas orientadas a objetos en
lenguajes de programacin, as como los beneficios que producen en el desario110 de software
Los conceptos claves de la programacin orientada a objetos se examina en
el captulo; si no ha ledo hasta ahora nada sobre tecnologas de objetos, deber
examinar con detenimiento todos los elementos conceptuales del captulo, que
se ampliarn en detalle en captulos posteriores; si ya tiene conocimientos bsicos de la orientacin a objetos, este captulo debe consolidarlos y prepararle
para una eficiente lectura de los siguientes captulos

Modularidad tipos abstractos de datos

31

2.1.. MODULARIDAD

MODULARIDAD:
TIPOSABSTRACTOSDEDATOS

La ptogramacin inodular trata de descomponer un progiama en un pequeiio


nmeio de abstracciones cohereiites que pertenecen al dominio del problema y
cuya complejidad interna es susceptible de ser enmascarada por la descripcin
de un interfaz
Si las abstracciones que se desean representar pueden en ciertos casos corresponder a una nica accin abstracta y se implen~entanen geneial con la nociii
de objeto abstiacto ( o tipo abstracto) caracterizado en todo instante por:
Un estado actual, definido por un cieito nmero de atributos
Un coijuizto de occioiles posibles,

CONTENIDO
2 , l Modularidad
2 2 Diseo de mdulos
2 3 Tipos de datos
2 4 Abstraccin en lenguajes de programacin
2 5 Tipos abstractos de datos
2 6 Tipos abstractos de datos en Turbo Pascal
2.7, Tipos abstractos de datos en Modula-2
2.8, Tipos abstractos de datos en Ada
2.9. Tipos abstractos de datos en C
210. Tioos abstractos de datos en C++
RESUMEN
EJERCICIOS
En este capitulo se examinarn los conceptos de modularidad y
abstraccin de datos La modularidad es la posibilidad de dividir
una aplicacin en piezas ms pequeas llamadas mdulos Abstraccin de datos es la tcnica de inventar nuevos tipos de datos
que sean ms adecuados a una aplicacin y, por consiguiente,
facilitar la escritura del programa La tcnica de abstraccin de
datos es una tcnica potente de propsito general, que cuando se
utiliza adecuadamente puede producir programas ms cortos,
ms legibles y flexibles,
Los lenguajes de programacin soportan en sus compiladores
tipos de datos fundamentales o bsicos (predefinidosl, tales com o int, char y float en C y C++, o bien integer, real o
boolean en Pascal Algunos lenguajes de programacin tienen
caractersticas que permiten ampliar el lenguaje aadiendo sus
propios tipos de datos,,
Un tipo de dato definido por el programador se denomina
tipo abstracto de dato, TAD(Abstract Data Type, ADTl El trmino
abstracto se refiere al medio en que un programador abstrae algunos conceptos de programacin creando un nuevo tipo de dato
La modularizacin de un oroarama
utiliza la nocin de tipo abs. tracto de dato (TAL4 siempre que sea posible Si el TAD soporta los
tioos
oue
desea el usuario v el coniunto de o~eracionessobre cada
,
,
tipo, se obtiene un nuevo tipo de dato denominado objeto

En consecuencia, la i~zodularidades la posibilidad de subdividir una aplicacin en piezas ms pequeas (denominadas iiz<dulos),cada una de las cuales
debe ser tan independiente como sea posible, coiisiderando la aplicacin como
un todo, as como de las otras piezas de las cuales es una paIte Este piincipio
bsico desemboca en el principio bsico de construi~programas inodula~esEsto
significa que, aproximadamente, ha de subdividir un pr.ograma en piezas ms
pequeas, o mdulos, que son generalmente iiidependientes de cada una de las
restantes y se pueden eizsainblar fcilmente para construir la aplicacin completa
E,n esencia, las abstracciones se impleinentan en mdulos, conocidos en la
terminologa de Booch como objetos, que agrupan eii una sola entidad:
Un conjunto de datos
Un conjunto de operaciones que actan sobie los datos
L.iskov define la rnodulariracin como el proceso de dividir un progranla
en nldulos que se pueden compilar separadamente, pero que tienen conexiones con otros mdulos Painas va ms lejos y dice que las conexiones entre
mdulos deben seguir el criterio de ocultacin de la iuform.acin: un sistema se
debe descomponer de acuerdo al criterio general, de que cada mdulo oculta
alguna decisin de diseo del resto del sistema; en otras palabias, cada mdulo
oculta un secreto
Si un piograma se descoinpoiie (o subdivide en mdulos) de modo consistente con el criterio de Pariias 4 s decir, aplicando el piincipio de ocultacin de la
inrormacin-, se reduce la complejidad de cada mdulo que compone la solucin Estos se constituyen en cierto modo independientes de los restantes, con lo
que se reduce la necesidad de toinar decisiones globales, operaciones y datos

2.1.1. La estructura de un mdulo


Un mdulo se caiacteriza fundaiiientalmente por su iiztelfaz y por su iinpleirieiztacin Parnas define el mdulo como un conjunto de acciones denominadas,
luiiciones o submdulos que coiresponden a una abstraccin coherente, que
compartan un conjunto de datos comunes implantadas estticamente llamadas
atributos, eventualmente asociadas a definiciones lgicas de tipos Las acciones
o funciones de un mdulo que son susceptibles de ser llamadas desde el exterior

32

Modularldad tipos abstractos de datos

Programacin orientada a objetos

se denominan p i ~ i n ~ t ~ uoupuntos
s
de entiada del mdulo Los tipos lgicos
eventualmente definidos en el interfaz permiten iepresentar los parmetros de
estas primitivas

Primitivas de acceso
Descripcin de propiedades de los datos

lnteraz

Seccin
privada

Atributos

Algoritmos

Representacin

Parmetros actuales

Figura 2 , l Estructura de u n mdulo,

2.1.2.

Reglas de modularizacin

En primer lugar, un mtodo de diseo debe ayudar al programador a resolver


un problema, dividiendo el problema en subproblemas ms pequeos, que se
puedan resolver independientemente unos de otros Tambin debe ser fcil
conectar los diferentes mdulos a los restantes, dentro del programa que est
escribiendo
Cada mdulo tiene un significado especfico propio y debe asegurarse que
cualquier cambio en su implementacin no afecte a su exterior (o al menos lo
mnimo) De igual modo, asegurar que los errores posibles, condiciones de
limites o frontera, comportamientos errticos, no se propaguen ms all del
mdulo (o como mximo a los mdulos que estn directamente en contacto
con el afectado)
Para obtener mdulos con las caractersticas anteriores deben seguirse las
siguientes reglas:

un archivo cuyo nombre tiene el sufijo . c Las dependencias entre archivos se


pueden declarar utilizando la macro #include En Turbo Pascal, los ~ndulos
se denominan unidades La sintaxis de las unidades dif'eiencia entre el iritetfaz y
la implementacin del mdulo Las dependencias entre unidades se pueden
declarar slo en un interfaz del mdulo Ada va ms lejos y define el paquete en
dos partes: la especificacin del paquete y el cuerpo del paquete Al contrario
que Object Pascal, Ada permite que la conexin entre mdulos se declaren
independientemente en la especificacin y en el cuerpo de un paquete,
lnterfaces adecuado,^

En la estructuracin de un programa en unidades es beneficioso que existan


pocos iilterfaces y que stos sean pequeos Es conveniente que existan pocos
enlaces entre los diferentes n~dulosen que se descompone un programa El
iizteifaz de un i~~dulo
es la parte del mdulo (datos, procedimientos, etc) que es
visible fuera del mdulo
Los interfaces deben ser tambin pequeos (esto es, su tamao debe ser
pequeo con respecto al tamao de los mdulos implicados) De este modo, los
mdulos estn acoplados dbilmente; se enlazarn por un nmero pequeo de
llamadas (Fig 2 1)
Pocos
interaces

Muchos
interaces

Figura 2 2 lnterfaces adecuados (pocos-muchos)

Unidades modulares

El lenguaje debe proporcionar estructuras modulares con las cuales se puedan


describir las diferentes unidades De este modo, el lenguaje (y el compilador)
puede reconocer un mdulo y debe ser capaz de manipular y gobernar su uso,
adems de las ventajas evidentes relativas a la legibilidad del cdigo resultante
Estas construcciones modulares pueden, como en el caso de los lenguajes orientados a objetos, mostrar caractersticas que facilitan la estructura del programa,
as como la escritura de programas En otras palabras, nos referimos a las
unidades modulares lingsticas, que en el caso de C++ se conocen como
clases En C/C++ los mdulos son archivos compilados separadamente, aunque la representacin ideal en C + + es la clase La prctica tradicional en
C/C++ es situar interfaces del mdulo en archivos cuyos nombres contienen el
sufijo . h (archivos de cabecera) Las implementaciones del mdulo se sitan en

33

Figura 2 3 lnterfaces adecuados (grandes-pequeos),

34

programacron orientada a oblelos

lnterfaces explicitos
El interfaz o parte visible exteinamente de un mdulo se debe declarar y describit explcitamente; el programa debe especificar cules son los datos y procedimientos que un indulo trata de exportar y cules deben permanece1 ocultos
del exterioi El interfaz debe ser fcilmente legible, tanto para el programador
como para el compilador Es decir, el programador debe comprender cmo
funciona el programa y el cornpilador ha de podei comprobar si el cdigo que
accede al mdulo se Iia escrito correctamente

!
1
!

11

Modularidad tipos abstraclos de dalos

35

2..2.DISENO DE MODULOS
Aunque el diseo modular persigue la divisin de un sistema grande en mdulos ms pequeos y a la vez manejables, no siempre esta divisin es garanta de
un sistema bien organizado Los mdulos deben disearse con los criterios de
acoylariiiento y cohesrdri El primer criterio exige independencia de mdulos y el
segundo criterio se corresponde con la idea de que cada mdulo debe realizarse
con una sola funcin relacionada con el problema
Desde esta perspectiva, Booch2 define la modularidad como la propiedad
de uiz sisteiizu que ha sido descoiizpuerto en un coiijunlo de nzdulos colzeiiuor );
dbilnieilte ucoplados

Ocultacin d e la informacin

221. Acoplamiento de mdulos

Todos los mdulos deben seguii el principio de ocultacin de la informacin;


cada tridulo debe representar al menos un elemento de diseo (por ejemplo, la
estructura de un registro, un algoritmo, una abstraccin, etc)
Otro criterio a tener en cuenta es la subdivisin de un sistema en mdulos,
es el principio denominado ubierto-cerrado', fotmulado por Meyer Este principio entiende que cada mdulo se considerar cei rudo (esto es, terminado, y por
consiguiente til o activo desde dentro de otros mdulos), y al mismo tiempo
debe ser abierto (esto es, sometido a cambios y modificaciones) El principio
abierto-cerrado debe producirse sin tener que rescribir todos los mdulos que
ya utilizan el indulo que se est modificando,

El ocoplamieizto es una medida del grado de inteidependencia eritre mdulos, es


decir, el modo en que un mdulo est siendo afectado por la esti.uctura irlteliia
de otro mdulo El grado de acoplamiento se puede utilizar para evaluai la
calidad de un diseo de sistema El objetivo es minimizar el acoplamiento entie
mdulos, es decir, minimirar su iute~dependencia,de modo que un mdulo sea
afectado lo menos posible por la estluctura de otro indulo El acoplamiento
entre mdulos vara en un amplio rango Por un lado, el diseo de un sistema
puede tener una jeiaiquia de mdulos totalmente desacoplados Sin embaigo,
dado que un sistema debe realizar un conjunto de funciones o tareas de un
inodo organizado, no puede constar de un conjunto de mdulos totalinente
desacoplados En el otro extremo se tendr una jeraiqua de indulos estrechamente acoplados; es decir, hay un alto grado de dependencia entre cada pareja
de mdulos del diseo
Tal como define Booch, un sistema modular dbilmente acoplado facilita:

-. -

- -.

.-

.-. .-

- ..

-.

-.

.-

kn lenguajes clc ~ i r o g r c i n ~ ; i ~ I ~l 5 ~
i l sla ~modilIar1~.1~611
~ ~ ~ ~ , h c C C I I ~ KCII~ lo,
subpii,gr:itn;is (pr~>cediniic~itos,
fi~~iei,)~lcs
y I ~ ~ I I I I : I SEn
.
1~11fiua.i~~
o r ~ n t ; ~ ;I~ lob;cios.
o~
1:l 1iiod11l:irIzaci61i
o parti~i611
dcl problelnii sc reI
S L I ~ I Y Ca travCs d? las ~Ip,)s:~h~tractos
LIS
d:~t.)s.
.-

-.

- -.

.-

.-

En diseo estiucturado, la modularizaciii -coino ya se ha coinentadose centra en el agrupanliento significativo de subprogramas, utilizaiido el criterio de acoplamiento y cohesin
En diseo orientado a objetos, el problema es sutilinente diferente: la tarea
consiste en decidir dnde se empaquetan lsicaiiiente las clases y objetos de
la estructura lgica del diseo, que son claramente diferentes de los subprogramas

'

Sobie el principio abierto-cerrado y su implementacin en C + + y Eiifel, se puede consultar la


bibliografia de Miguel Katrib Algunos ttulos destacados sobre orientacin a objetos son: Piogiaiiiaciiz 0i ieiitada a Objetos <it~.avrde C + + y Eiffel V Escuela Internacional en Temas Selectos de
Computacin, Zacatecas, Mxico, 1994 (esta Escuela est organizada por la UNAM, Mixico);
Pi.ogi.aiiiaiin 0i.ieiitada a Objeto7 en C i + Iiiiosys, Mxico, 1994; Culieetioiis aiid Irerators iit
Eifei Joop, vol 6, n o 7, nov/dic 1993

La sustitucin de un mdulo por otro, de modo que slo unos pocos


mdulos sern afectados por el cambio
2 E.1 seguimiento de un erior y el aislamiento del n~dulodefectuoso que
produce ese error
Existen varias clases de acoplainiento entre dos mdulos (Tabla 2 1) Examinaremos los cinco tipos de acoplamiento, desde el menos deseable (esto es,
acoplamiento estrecho o impermeable) al ms deseable (esto es, acoplamiento
ms dbil) La fuerza de acoplamiento entre dos mdulos est influenciada por
el tipo de conexin, el tipo de comunicacin entre ellos y la complejidad global
de su interfaz
1

2.2..2.Cohesin de mdulos
La cohesin es una extensin del concepto de ocultamiento de la iiiforinacin
Dicho de otro modo, la cohesin describe la natulaleza de las interacciones
Booc~,Grady: Ohjeit Oiiri?ted Desigil ittii appiicurioiir Benjarnin/Cummings 1991, py 52

36

Programacion onentada a obletos

Modularidad tipos abstractos de datos

dentro de un mdulo software Este criterio sugiere que un sistema bien modularizado es aquel en el cual los interfaces de los mdulos son claros y simples,
Un mdulo cohesivo ejecuta una tarea sencilla de un procedimiento de software y requiere poca interaccin con procedimientos que ejecutan otras partes de
un programa En otras palabras, un mdulo cohesivo slo hace (idealmente)
una cosa
La cohesin y el acoplamieiito se miden como un espectro que muestra
las escalas que siguen los mdulos L.a T'abla 2 1 muestra la clasificacin de
acoplamientos de mdulos y su grado de acoplamiento

funcin de un tipo de datos; ocultan la implementacin de las operaciones


definidas por el usuario asociadas con el tipo de datos Esta capacidad de
ocultar la informacin permite el desarrollo de componentes de software reutilizables y extensibles
Un tipo de dato es un conjunto de valores, y un conjunto de operaciones
defiizidas por esos valores
Un valor depende de su representacin y de la interpretacin de la representacin, por lo que una definicin informal de un tipo de dato es:

Tabla 2 1 Clasificacin del acoplamiento de mdulos


Tipu de ac~~plnmirnio

< ; r ~ dde
o acoplamiento

Grado de manrenibilidad

Por contenido
Comn
De control
Por sellado (estampado)

Alto (fuerte)

Bajo

Alto

Datos
Sin acoplamiento

Bajo (dbil)

La Tabla 2 2 muestra los grados de cohesin: baja cohesin (no deseable) y


alta cohesin (deseable), as como los diferentes tipos de cohesin
Tabla 2 2

Clasificacin de cohesin de mdulos

'1 ipo de cohesiiin

<;rddo de cnhesin

tirado dc manteniniiento

Por coincidencia
Lgica
Temporal
Po1 procedimientos
Por comunicacioiies
Secuencia1
Funcional
Info~macional

Bajo

Bajo

Alto

Alto

Idealmente, se burcalz rndulor altarnerzte cohesivos y dbilmente acoplados

37

Repiesentacin

+ Operaciones

Un tipo de dato describe un conjunto de objetos con la misma representacin Existen un nmero de operaciones asociadas con cada tipo Es posible
realizar aritmtica sobre tipos de datos enteros y reales, concatenar cadenas o
recuperar o modificar el valor de un elemento
La mayora de los lenguajes tratan las variables y constantes de un programa como instancias de un tipo de dato Un tipo de dato proporciona una
descripcin de sus instancias que indican al compilador cosas como cunta
memoria se debe asignar para una instancia, cmo interpretar los datos en
memoria y qu operaciones son permisibles sobre esos datos Por ejemplo,
cuando se escribe una declaracin tal como f l o a t z en C o C++, se est
declarando una instancia denominada z del tipo de dato f l o a t El tipo de
datos f l o a t indica al compilador que reserve, por ejemplo, 32 bits de memoria, y que operaciones tales como suiliar y multiplicar estn permitidas,
mientras que operaciones tales como el el resto (mdulo) y desplazamiento
de bits no lo son Sin embargo, no se necesita escribir la declaracin del tipo
f l o a t - e l autor de compilador lo hizo por nosotros y se construyen en el
compilador- L.os tipos de datos que se construyen en un compilador de este
modo se conocen como tipos de datos fulzdamentales (predefinidos), y por ejemplo en C y C++ son, entre otros: i n t , c h a r y f l o a t
Cada lenguaje de programacin incorpora una coleccin de tipos de datos
fundamentales, que incluyen normalmente enteros, reales, carcter, etc Los
lenguajes de programacin soportan tambin un nmero de constructores de
tipos incorporados que permiten general tipos ms complejos Por ejemplo,
Pascal soporta registros y arrays,
En lenguajes convencionales tales como C, Pascal, etc, las operaciones
sobre un tipo de dato son composiciones de constructores de tipo y operaciones de tipos bases

2.3. TIPOS DE DATOS


Todos los lenguajes de piogramacin soportan algn tipo de datos Por ejemplo, el lenguaje de programacin convencional Pascal soporta tipos base tales
como enteros, reales y caracteres, as como tipos compuestos tales como arrays
(vectores y matrices) y registros Los tipos abstractos de datos extienden la

Operaciones

Operaciones constructor

+ Operaciones base

Algunos tipos de constructores incluyen registros, arrays, listas, conjuntos,


etctera

38

Programacin orientada a objetos

2.4.. ABSTRACCION EN LENGUAJES


DE PROGRAMACION
Los lenguajes de programacin son las herramientas mediante las cuales los
diseadores de lenguajes pueden implementar los modelos abstractos La abstraccin ofiecida por los lenguajes de programaciu se puede dividir en dos
categoras: abstracciil de datos (perteneciente a los datos) y abstraccin de
coiztrol (perteneciente a las estructuras de control),
Desde comienzo del decenio de los sesenta, en que se desarrollaron los
primeros lenguajes de programacin de alto nivel, ha sido posible utilizar las
abstiacciones ms primitivas de ambas categoras (variables, tipos de datos,
procedimientos, control de bucles, etc) Ambas categoras de abstracciones han
producido una gran cantidad de lenguajes de programacin no siempre bien
definidos

Modularidad tipos abstractos de datos

39

Con el nombre de los subprograinas, un programador puede asigna1 una


descripcin abstracta que captura el significado global del subprograma,
Utilizando el nombre en lugar de escribir el cdigo, permite al programador aplicar la accin en trminos de su descripcin de alto nivel, en lugar
de sus detalles de bajo nivel.
L.os subprogramas en Pascal proporcionan ocultacin de la informacin.
Las variables locales y cualquier otra definicin local se encapsulan en el
subprograma, ocultndolos realmente, de fbrma que no se pueden utilizar
fuera del subprograma Por consiguiente, el programador no tiene que
preocuparse sobre las definiciones locales; sin embargo, pueden utilizarse
los componentes sin conoce1 nada sobre sus detalles
L.os parmetros de los subprogramas, junto con la ocultacin de la informacin anterior, permite crear subprogramas que constituyen entidades
de software propias Los detalles locales de la implementacin pueden
estar ocultos, mientras que los parmetros se pueden utilizar para establecer el interfaz pblico

2..4.1. Abstracciones de control


Los microprocesado~esofrecen directamente slo dos mecanismos para controlar el flujo y ejecucin de las instrucciones: secuencia y salto Los primeros
lenguajes de programacin de alto nivel introdujeron las estructuras de control:
sentencias de bifurcacin ( i f ) y bucles ( f o r , while, do-loop, etc).
L.as estructuras de control describen el orden en que se ejecutan las sentencias o grupos de sentencia (unidades de progi ama) Las unidades de programa se
utilizan coino bloques bsicos de la clsica descomposicin descendente En
todos los casos, los subprogramas constituyen una herramienta potente de
abstraccin, ya que durante su implementacin el programador describe en
detalle cmo funcionan los subprogramas Cuando el subprograma se llama,
basta con conocer lo que hace y no cmo lo hace De este modo, los subprogramas se convierten en cajas negras que amplan el lenguaje de progiamacin a
utilizar En general, los subprogramas son los mecanismos ms ampliamente
utilizados para reutilizar cdigo, a travs de colecciones de subprogramas en
bibliotecas,
Las abstracciones y estructuras de control se clasifican en estructuras de
control a nivel de sentencia y a nivel de unidades Las abstracciones de control
a nivel de unidad se conoce coino abstraccin procedinzental
Abstraccin procedimental (por procedimientos)

Es esencial para disear software modular y fiable La abstracciiz procedimental se basa en la utilizacin de procedimientos o funciones, sin preocuparse de
cmo se implementan Esto es posible slo si conocemos qu hace el procedimiento; esto es, conocemos la sintaxis y semntica que utiliza el procedimiento
o funcin El nico mecanismo en Pascal estndar para establecer abstraccin
procedimental es el subprograma (procedimientos y funciones) La abstraccin
aparece en los subprogramas debido a las siguientes causas:

Otros mecanismos de abstraccin de control

L.a evolucin de los lenguajes de programacin ha permitido la aparicin de


otros mecanismos para la abstraccin de control, tales como inanejo de excepciones, coirutinac. unidades coizcurrentes, plantillas (templales) Estas constiucciones son soportadas por los lenguajes de programacin basados y orientados
a objetos, tales como Modula-2, Ada, C + + , Smalltalk o Eiffel

2..4.2. Abstraccin de datos


Los primeros pasos hacia la abstraccin de datos se crearon con lenguajes tales
como FORTRAN, COBOL y AL.GOL 60, con la introduccin de tipos de
variables diferentes, que manipulan enteros, nmeros reales, caracteres, valores
lgicos, etc Sin embargo, estos tipos de datos no podan ser modificados y no
siempre se ajustaban al tipo de uno para el que se necesitaban Por ejemplo, el
tratamiento de cadenas es una deficiencia en FORTRAN, mientras que la precisin y fiabilidad para clculos matemticos es muy alta
La siguiente generacin de lenguajes, incluyendo Pascal, SIMULA-67 y
ALGOL 68, ofreci una ainplia seleccin de tipos de datos y permiti al piogramador modificar y ampliar los tipos de datos existentes mediante construcciones especficas (por ejemplo arrays y registros) Adems, SIMULA-67 fue el
primer lenguaje que mezcl datos y procedimientos mediante la construccin
de clases, que eventualmente se convirti en la base del desarrollo de programacin orientada a objetos
La abstiacciil de datos es la tcnica de programaciu que permite inventar
o definir nuevos tipos de datos (tipos de datos definidos por el usuario) adecuados a la aplicacin que se desea realizar La abstraccin de datos es una tcnica
muy potente que permite disear programas ms cortos, legibles y flexibles La

40

Programacin orientada a objetos

esencia de la abstraccin es similar a la utilizacin de un tipo de dato, cuyo uso


se realiza sin tener en cuenta cmo est representado o implementado
Los tipos de datos son abstracciones y el proceso de construir nuevos tipos
se llaman abstracciones de datos Los nuevos tipos de datos definidos por el
usuario se llaman tipos abstractos de datos,
El concepto de tipo, tal como se defini eii Pascal y ALGOL 68, ha constituido un hito importante hacia la realizacin de un lenguaje capaz de soportar
programacin estructurada Sin embargo, estos lenguajes no soportan totalmente una metodologa La abstraccin de datos til para este propsito no
slo clasifica objetos de acuerdo a su estructura de representacin, sino que se
clasifican de acuerdo al comportamiento esperado Tal comportamiento es expresable en trminos de operaciones que son significativas sobre esos datos, y
las operaciones son el nico medio para crear, modificar y acceder a los objetos.
En trminos ms precisos, Ghezzi indica que un tipo de dato definible poi el
usuario se denomina tipo abstracto de dato (TAD) si:
Existe una construccin del lenguaje que le permite asociar la representacin de los datos con las operaciones que lo manipulan
L.a reptesentacin del nuevo tipo de dato est oculta de las unidades de
programa que lo utilizan [Ghezzi 871

Modularidad tipos abstractos de datos

Un IAD se compone de estructuras de dator y los procedimientos o funciones que manipulan esas estructuras de datos,

TAD = Representacin (datos) + Opetaciones (funciones y p~ocedimientos)

Las opetaciones desde un enfoque orientado a objetos se suelen denominar


mtodos
La estructura de un tipo abstracto de dato (clase), desde un punto de vista
global, se compone del interfaz y de la implementacin (Fig 2 4)

Mtodo 3

Interfaz pblico

estructuras de datos

La representacin: eleccin de las estructuras de datos


Las operaciones: eleccin de los algoritmos,

Implementacin de mtodos:
Cdigo del mtodo 1
Cdigo del mtodo 2
Cdigo del metodo 3
Cdigo del mtodo 4

El interfaz del tipo abstracto de dato se asocia con las operaciones y datos
visibles al exterior del TAD

2.5. TIPOS ABSTRACTOS DE DATOS

Mtodo 4

Las clases en SIMULA slo cumplan la primeia de las dos condiciones,


mientras que otros lenguajes actuales cumplen las dos condiciones: Ada, Modula-2 y C+ +
Los tipos abstractos de datos proporcionan un mecanismo adicional mediante el cual se realiza una separacin clara entre el interfaz y la implernetztacin del tipo de dato La implementacin de un tipo abstracto de dato consta de:
2

41

Implementacin privada
Algunos lenguajes de programacin tienen caractersticas que nos permiten
ampliar el lenguaje, aadiendo sus propios tipos de datos Un tipo de dato
definido por el p~ogramadorse denomina tipo abstracto de datos (TAD) para
diferenciarlo del tipo fundamental (predefinido) de datos Por ejemplo, en Turbo Pascal un tipo Punto, que representa a las coordenadas x e y de un sistema
de coordenadas rectangulares, no existe Sin embargo, es posible implementar
el tipo abstracto de datos considerando los valores que se almacenan en las
variables y qu operaciones estn disponibles para manipular estas variables
En esencia, un tipo abstracto de datos es un tipo de datos que consta de datos
(estructuras de datos propias) y operaciones que se pueden realizar sobre esos
datos

Figura 2 4 , Estructura de un tipo abstracto de datos (TAD),

Las estructuras de datos reales elegidas para almacenar la representacin


de un tipo abstracto de datos son invisibles a los usuarios o clientes. Los
algoritmos utilizados para implementar cada una de las operaciones de los
TAD estn encapsuladas dentio de los propios TAD La caracterstica de ocultamiento de la informacin del TAD significa que los objetos tienen interfaces
pblicos Sin embargo, las representaciones e implementaciones de esos interfaces son privados

42

Programacin

orientada a obletos

Modolaridad

tipos abstractos de datos

43

2..5.,1. Ventajas de los tipos abstractos de datos

2.6.. TIPOSABSTRACTOSDEDATOSENTURBOPASCAL

Un tipo abstracto de datos es un modelo (estructura) con un nmero de operaciones que afectan a ese modelo Es similar a la definicin que daremos en el
captulo siguiente de objeto, y de hecho estn unidos ntimamente L.os tipos
abstractos de datos pioporcionan numerosos beneficios al programador, que se
pueden resumir en los siguientes:

Una pila es una de las estructuras de datos ms utilizadas en el mundo de la


compilacin Una pila es un tipo de dato clsico utilizado frecuentemente para
introducir al concepto de tipo abstracto de datos; es una lista lineal de elementos en la que los elementos se aaden o se quitan por un solo extremo de la
lista La pila almacena elementos del misino tipo y actan sobre ella las operaciones clsicas de Meter y Sacar elementos en dicha pila, teniendo presente la
estructura lgica LIFO (ltimo en entrai, primero e71 salii)

1
2

4
5
6

Permite una mejor coilceptualizacin y modelizacin del mundo real


Mejora la representacin y la comprensibilidad Clarifica los objetos
basados en estructuras y comportamientos comunes,
Mejora la robustez del sistema Si hay caractersticas subyacentes en los
lenguajes, permiten la especificacin del tipo de cada variable, los tipos
abstractos de datos permiten la comprobacin de tipos para evitar errores de tipo en tiempo de ejecucin
Mejora el rendimiento (prestaciones) Para sistemas tipeados, el eonocimiento de los objetos permite la optimizacin de tiempo de compilacin
Separa la implementacin de la especificacin Permite la modificacin
y mejora de la implementacin, sin afectar al interfaz pblico del tipo
abstracto de dato
Permite la extensibilidad del sistema Los componentes de software
reutilizables son ms fciles de ciear y mantener
Recoge mejor la semntica del tipo Los tipos abstractos de datos agrnpan o localizan las operaciones y la representacin de atributos

Pila
1

Estructura de datos

Almacena una serie de elementos del tipo elemento La pila esta inic~almente
vacla y los elementos se meten o sacan en la pila por el mismo extremo
Operaciones (Procedimientosque actan sobre la estructura de datos)
Meter
Sacar
Crear
Destruir
Pilavaca

Sacar?

7
Meter

2..5.2..
Implementacin de los TAD
Los lenguajes convencionales, tales como Pascal, permiten la definicin de
nuevos tipos y la declaracin de piocedimientos y luneiones para realiza1 operaciones sobre objetos de los tipos Sin embargo, tales lenguajes no permiten
que los datos y las operaciones asociadas sean declaradas juntos como una
unidad y con un solo nombre En los lenguajes en el que los mdulos (TAD) se
pueden implementar como una unidad, stos reciben nombres distintos:
Turbo/Borland Pascal
Modula-2
Ada
C++
lava

unidad, objeto
mdulo
paquete
clase
clase

En estos lenguajes se definen la especflcacin del TAD, que declara las


operaciones y los datos ocultos al exterior, y la implementacin, que muestra el
cdigo fuente de las operaciones y que permanece oculto al exterior del mdulo,
Las ventajas de los TAD se pueden manifestar en toda su potencia, debido a
que las dos partes de los mdulos (e,spec@cacine implementacin) se pueden
compilar por separado mediante la tcnica de compilacin separada (eseparate
compilutiori~),

Figura 2 5

Estructura de datos Pila,

En Turbo Pascal, los TAD se implementan mediante estructuras tipo unidad Recordemos que una unidad es una biblioteca de funciones y procedimientos que pueden ser utilizados poi cualquier programa con la condicin de
incluir el nombre de la unidad en la clusula u s e s de su sintaxis
unit <nombre unidad,;
interface

.cclaucula uses,
<constantes, tipos y variables publicas,
<cabeceras de procedimientos y funciones publicas>
implementation

cclaucula uses,
<constantes tipos y variables privadas,
<procedimientos/funciones privadas y cuerpos de
procedimientos/funciones publicas,
begin

<secuencia de sentencias para inicializacion,


end.

44

Programacin orientada a objetos

Modularidad tipos abstractos de datos

La implementacin de una pila con capacidad para 1000 elementos del


tipo entero es:
unit Pila;
interface
const
MaxPila = 1000;
type
TipoElemento = integer;
ListaElementos = array [l MaxPilal of TipoElernento;
tipo = record
Elernc : LictaElementoc;
Cima
2nd;

45

Una vez que se ha implementado el tipo de dato Pila, ste puede ser utilizado en cualquier programa con tal de invocar en la clusula uses a dicho tipo
de dato Pila

2..6.1. Aplicacin del tipo abstracto de dato Pila


El siguiente programa lee una secuencia de enteros, uno por lnea, tales como
estos:

integer;

procedure Crear jvar S:tipo);


( * S se inicializa y se limpia o vaca

*)

y genera la misma secuencia de nmeros en orden inveiso (los saca de la pila)

procedure Destruir (var S:tipo);


( * Se libera memoria asignada a S * )
( * S no est inicializada
*
procedure Meter (var S:tipo; Item: tipoElemento);
( * Se aade un elemento a la cima de la pila * )
procedure Sacar (var S:tipo; 1tem:tipoElemento);
( * quitar un elemento de la pila * )
procedure PilaVacia (var S:tipo):boolean;
( * devuelve true si S es vacia; false en caco contrario

Esta tarea se consigue metiendo nmeros en la pila y a continuacin vaciando dicha pila
*)

program Nmeros;

implementation
procedure Crear (var S:tipo);
begin
SCima : = O ;
end;

uses
Pila;
var
S:Pila Tipo;

procedure Destruir (var S:tipo);


begin
S ( * no hace nada * )
end;

procedure LeeryAlmacenarNumerocjvar NumPi1a:PilaTipo);


var
Aux:Pila Ti~oElemento:
begin
while not eof do
beain
.
readln (Aux);
Pila Meter (NumPila, Aux) ;
end;
2nd;

procedure Meter (var S:tipo; 1tem:lipoElemento);


begin
S Cima : = S.cima + 1;
S ElemsIS Cima1 : = Item;
end;
procedure Sacar (var S:tipo; var 1tem:TipoElemento);
begin
Item : = S Elernscs Cima];
end ;

roced dure PilaVacia (var S:ti~o):boolean;


begin
PilaVacia : = (S Cima=O);
end;
end

procedure VerNumeros(var NumPila: Pila Tipo);


var
AUX: Pila TipoElemento;
begin
while not Pila Pilavacia(NumPi1a) do
begin
Pila Sacar(NumPila, Aux);
WriteLn (Aux);
end;
( * while * )
end;
( * VerNumeros * )

46

Modulandad t ~ p o sabstractos de datos

Programacin orientada a objetos


begin
( * programa p r i n c i p a l * )
P i l a Crear ( S )
LeeryAlmacenarNumeros(S);
P i l a Destruir (S);
end
( * f i n de p r i n c i p a l * )

Al igual que se ha definido el tipo P ~ l acon estructuras estticas tipo airay,


se poda haber realizado con estructuras dinmicas tales como listas enlazadas
De igual modo se pueden implementar otros tipos de datos abstractos, tales
como, por ejemplo, las colas que se utilizan en muchas aplicaciones: sistemas
operativos, sistemas de comunicaciones, etc

2..7. TIPOS ABSTRACTOS DE DATOS EN MODULA-2


Modula-2, el segundo lenguaje inventado por Niclaus Wirth (el diseado1 de
Pascal), soporta esencialmente las caractersticas de:
Coinpilacin reparada de mdulos
Abstiaccin de dalos

TAD: los tipos de datos y las definiciones de las operacioiies asociadas (que
manipulan) con esos datos se agrupan en una parte (mdulo de definicin:
DEFINITION MODULE)
y el cuerpo de las operaciones asociadas en otra parte
(mdulo de impkmentacin: IMPLEMENTATION MODULE)

2..7.2. Mdulos locales


Un mdulo anidado (declarado) dentro de otro mdulo o procediinieuto se
denomina nldulo local Las declaraciones de los mdulos locales aparecen en
la misma posicin que las declaiaciones de otras entidades
Los mdulos locales tienen propiedades similares a los mdulos biblioteca,
incluyendo la capacidad de importar y exportar entidades
La abstraccin de datos es posible realizarla en Modula-2 a travs de la
construccin mdulo que proporciona el encapsulamiento y ocultamiento de
los datos L.a visibilidad y ocultamiento de los datos se puede obtener mediante
tipos opacos (ocultos o privados) o tiaizsparentes (pblicos),
Mdulo

2..7..1. Mdulos
La construccin que proporciona las caractersticas citadas anteriormente se
denomina mdulo Sintcticamente, el mdulo posee la misma estructuia que
las uniones en Pascal (versiones USCD y Turbo de Borland)
Un programa en Modula-2 pioporciona una coleccin de mdulos biblioteca que pueden ser ampliados por el programador escribiendo sus propios mdulos biblioteca. Los mdulos programa y biblioteca pueden contener anidados mdulos ms pequeos ocultos del resto del programa, que se denominan
rndulor locales
Los mdulos pueden compilarse por separado y facilitan a los programadores el desarrollo de bibliotecas de cdigo reutilizable y la construccin de grandes programas,
El formato bsico de un mdulo es:
MODULE i d e n t i f i c a d o r - m o d ;

<declaraciones>

BEGIN
<sentencias>
END i d e n t i f i c a d o i o d

En Modula-2, la especificacin y la implementacin de un tipo abstracto de


datos se compilan por separado en uii rndulo de definicin y en un mdulo de
iinpleineiztacirz Esta separacin es consistente con el principio fundamental del

47

Datos opacos

Figura 2 6

Ocultamiento de datos,

2.7.3. Tipos opacos


Un tipo opaco es, como su nombre indica, uno cuya estructura se oculta de sus
usuarios Un tipo opaco se puede exportar desde un mdulo y se puede utiliza1
para declarar objetos, tales como variables, elementos de arrays y campos de
registros, en mdulos que los importan.
El uso de un tipo opaco en el mdulo de definicin soporta el principio de
ocultamiento: los detalles de la implemeutacin del tipo de dato (pila en el
ejemplo) estn separados de su declaracin y estn ocultos en el mdulo de
implementacin, junto con la implementacin de las operaciones
El tipo opaco se define en el mdulo de definicin en la seccin TYPE Un
mdulo cliente que importa un tipo opaco se puede utilizar de igual modo que
cualquier tipo en Modula-2 Dado que los mdulos clientes no conocen la
estructura del tipo, las nicas operaciones que pueden realizar sobre variables
del tipo dado sin asignaciones y pruebas de igualdad y desigualdad

48

Modularidad. tipos abstractos de datos

Programacin orientada a objetos

Cuando la parte de definicin de un mdulo biblioteca define un tipo opaco, la parte de implementacin del mdulo debe incluir una declaracin completa del tipo La declaracin completa de un tipo opaco se debe especificar
como un tipo abstracto de dato Pila,y es el siguiente:
DEFINICION MODULE PILA:
( * Tipo opaco * )
TYPE Pila;
PROCEDURE Inicializar(vAR S: Pila);
PROCEDURE Meter(VAR S: Pila) : INTEGER;
PROCEDURE Sacar( S : Pila) : INTEGER;
PROCEDURE Pilavacia(s: Pila) : BOOLEAN;
PROCEDURE Pilallena(s: Pila) : BOOLEAN;
END PILA

La declaracin de un tipo opaco se hace en el mdulo de implementacin


IMPLEMENTATION MODULE PILA;
CONST
LongPila = 100;
TYPE Registropila = RECORD
PilaArray : ARRAY 11 .LangPila] OF Char;
CimaDePila: [O LongPila + 11
END :
Pila = POINTER TO Registrapila;

2.7.4. Tipos transparentes


Un mdulo de definicin puede contener la declaracin de -estructuraun
tipo de dato, en cuyo caso el tipo se denomina transparente o pblico, y se
puede acceder a l y a sus campos desde cualquier mdulo cliente
Veamos cmo se escriben los mdulos de definicin y de implementacin de
un tipo abstracto de datos pilacaracteres.Se puede definir el tipo de dato
mediante arrays o punteros; en este caso consideremos la implementacin mediante arrays El mdulo Pilacaracteres permite la exportacin del tipo de
dato Piiacar,que tiene carcter transparente
DEFINITION MODULE PilaCaracterec;
( * exporta tipo PilaCar (pila de caracteres)
v
- -orocedimientos vara rnani~ulacinde variables de tioo
PilaCar * )
CONST TamanyoPila = 100:
( * mximo tamao de un tipo PilarCar * )
TYPE PilaCar = RECORD
ArrayPila : ARBAY [1 TamanyoPilal OF CHAR;
Cimapila : [O TamanyoPila + 11
END;
( * exportacin transparentes de PilaCar * )
PROCEDURE Meter(VAR S : PilaCar; ch: CHAR);
( * empuja ch en la pila S ; termina programa si pila
ect llena * )

49

PROCEDURE Sacar(Vm S : PilaCar; VAR ch: C m ) ;


( * almacena elemento superior de la pila s en ch. a
continuacin saca S ; termina programa si pila est
vacia * )
PROCEDURE EsVacia(s: PilarCar): BOOLEAN;
( * devuelve TRUE si s ect vaca * )
END Pilacaracteres

Este mdulo tiene algunos inconvenientes Si se decide incrementat el tamao mximo de la pila, se deben recompilar todos los mdulos que importan
Piiacaracteres,incluso cuando cambie la representacin de Piiacar Estos inconvenientes y otros ms no citados se pueden mejorar haciendo Pilacar de tipo opaco, permitiendo que Piiacaracteres exporte Pilarcar sin
proporcionar ninguna informacin a los mdulos cliente sobre la estructura
real de la variable Piiacar Este enfoque resuelve nuestros problemas: se
puede cambiar la representacin de PilaCar en cualquier momento sin cambiar los mdulos cliente y se asegura que los clientes no pueden modificar
variable Pilacar,excepto a travs de procedimiento exportados por Pilacaracteres

2.7.5.

Una versin del tipo abstracto de dato Pila


con datos opacos

Una versin mejorada del mdulo de definicin de Pilacaracteres con


Piiacar definida como un tipo opaco es:
DEFINITION MODULE PilaCaracterec;
( * exporta tipo PilaCar (pila de caracteres)
y procedimientos para manipulacin de variables de tipo
PilaCar * )
TYPE PilaCar; ( * exportacin opaca * )
PROCEDURE InicializariVAR S : PilaCar);
( * crea una pila s y la hace vacia * )
PROCEDURE Meter(VAR S: PilaCar; ch: C m ) ;
( * empuja ch en pila S ; termina programa si pila est
llena * )
PROCEDURE Sacar(VAR S: PilaCar; VAR ch: C H A R ;
( * almacena elemento superior de pila s en ch, a
continuacin saca S ; termina programa si pila est
vacia * )
PROCEDURE EsVacia(s: PilaCar) : BOOLEAN;
( * devuelve TRUE si s es vacia, FALSE en caso
contrario * )
END Pilacaracteres

Los mdulos que importan PilaCar pueden declarar variables de tipo


Piiacar,pero el nico medio para manipular estas variables es a travs de los
procedimientos Inicializar,Meter, Sacar y EsVacia
La especificacin completa del tipo Pilacar debe aparecer en la seccin de
implementacin de Piiacaracteres Dado que PilaCar debe ser un tipo

50

Modularidad: tinos abstractos de datos

Programacion orientada a objetos

puntero, se declara como un puntero a un registro que contiene los campos


ArrayPila y CimaPila.El procedimiento Inicializar asigna espacio para
estos registros y despus fija el campo Cimapila a O E
l mdulo de implementacin es:
IMPLEMENTAIION MODULE PilaCaracteres;
FROM Storage IMPORT ALLOCATE
FROM 10 IMPORT WrStr, WrLn;
CONST TamanyoPila = 100;
( * tamao mximo de una PilaCar * )
TYPE PilaRea
- =
RECORD
ArrayPila : Array[l TamanyoPila] OF CHAR;
CimaPila : 10 Timanvo~ila-+11
END ;
PilaCar = POINTER TO PilaReg;

FROM IO IMPORT RdKey, WrChar, WrStr, WrLn;


FROM Pilacaracteres IMPORT PilaCar, Inicializar, Meter,
Sacar, EsVacia;
CONST rc = 15c;
VAR

H?.LT

PROCEDURE EsVacia(5: PilaCar) : BOOLEAN:


( * devuelve TRUE si s est vaca * )
BEGIN
RETURN s A cimapila = O
END EsVacia;
END Pilacaracteres

*)

(*

retorno de carro

(*

vacia pila s

*)

s : PilaCar;
car: CHAR

BEGIN
Inicializar(s);

PROCEDURE Meter(VAR S : PilaCar; ch: CHAR);


( * empuja ch en la pila S ; termina programa si pila llena
BEGIN
INC (sA.cimaPila);
IF S" cimaPila c tamanyoPila THEN
Wrstr ( Desbordamiento Pila'') ;
WrLn;
HALT
END;
SA.UrayPila [ S " cimapila] : = ch
END Meter;

END ;
ch : = sA.ArrayPila[cA cimapila];
DEC ( S ^ cimapila)
END Meter;

Una aplicacin Inversa utiliza un mdulo programa que lee una cadena
de caracteres y visualiza su inversa Este programa es fcil de escribir si se
utiliza una pila para almacenar la cadena A medida que lee caracteres, se van
empujando a la pila, detenindose cuando se alcanza el final de la cadena
Inversa saca los caracteres de la pila hasta que se vace, escribiendo a continuacin cada carcter a medida que se saca el carcter
MODULE Inversa;
( * invierte una cadena escrita por el usuario * l

PROCEDURE Inicializar(VAR S : PilaCar);


( * crea una pila y la hace vaca * )
EEGIN
ALLOCATE ( s . SIZE (PilaREg);
sA.CimaPila : = O
END Inicializar;

PROCEDURE Sacar(VAR S : PilaCar; VAR ch: CII4R);


( * almacena elemento superior de la pila s en ch.
despus saca S ; termina programa si pila est vaca
BEGIN
SF S^ cimapila = O THEN
Wrstr( Desbordamiento negativo pila"):
WrLn;

51

WrStr ("Introduzca cadena: " )


car : = RdKeyO;
WHILE car # rc Do
WrChar (car);
Meter(s,car);
car : = RdKey
END ;
WrLn;
WrStr("Cadena inversa es:
WHILE NOT EsVacia ( S ) DO
Sacar(s,car);
WrChar(car1
END;
WrLn;
END Inversa

*)

) ;

*)

2.7..6. Otra aplicacin del TAD Pila


Disear un TAD pila que disponga de un tipo opaco (su representacin slo
ser visible en el mdulo de implementacin; no sern visibles a los mdulos
clientes) L.os tipos opacos se restringen a punteros y, en consecuencia, es preciso asignar memoria dinmicamente antes de utilizarlos Por consiguiente, hay
que incluir un procedimiento de inicializacin de modo que el usuario pueda
crear una pila para su uso
definition module pilamod:
type pilatipo;
procedure vaca (stk:pilatipo):boolean;

52

Modolaridad tipos abstractos de datos

Programacin orientada a objetos

procedure meter (var stk:pilatipo; e1emento:integer);


procedure quitar (var ctk:pilatipo);
roce dure cima (stk:pilatipo):integer;
end pilamod

53

El siguiente cdigo crea e inicializa una pila, mete dos valores, 4 2 y 2 7 ,


luego saca el 2 7 y deja el valor 4 2
module usodepila;
from InOut import WriteLn, Writelnt, WriteString;
frompilamodimportpilatipo vacia,meter,quitar,cimacrear;

implementation module pilamod;


from InOut import WriteString, WriteLn;
from Starage import allocate
const max = 100;

var pi1a:pilatipo;
var aux:integer;

type pilatipo = pointer to


record
lista: arrayil maxlof integer;
cimasub: [ O maxl
end;
procedure vacia (stk:pilatipoi :boolean;
begin
return stkA cimasub = 0
end vacia;

begin
crear (pila);
meter (pila, 4 2 ) ;
meter (pila, 2 7 ) :
quitar (pila!;
aux : = cima (pila);
end usodepila

procedure meter (var stk:piiatipo; e1emento:integer);


begin
if stkA.cimapila = max then
WriteString ( "error - desbordamiento pila") ;
WriteLn;
else
Inc (stkA licta[stkA cimapilal : = elemento
end
end meter;
procedure quitar 1stk:piiatipo) :integer:
begin
if vacia (stk) then
WriteString("Err0r - desbordamiento negativo");
WriteLn
elce
dec (stkA.cimasub)
end ( * fin de if vacia * )
end auitar;

roced dure cima (stk:pilatipo):integer;


begin
if vacia (stk) then
WriteString ("Error - desbordamiento negativo")
WriteLn;
else
return stkA cimasublstkA cimasubl
end
end cima;
procedure crear (var stk:pilatipoi;
begin
new (ctk);
stkA cimasub := O
end crear;
end pilamod

2.8. Tipos abstractos de datos en Ada


Ada proporciona unidades de programa: construcciones que estn definidas
con un nombre y son autnomas en el diseo de un programa Las unidades en
Ada son:

Subprogramas: procedimientos y funciones anlogos a sus homnimos en


Pascal
Tareas: unidades de programa diseadas para ejecutarse concurrentemente, que se identifican como colecciones estticas de cdigo y procesos
Paquetes: construcciones que soportan abstraccin de datos y son la base
de componentes software
Unidades genricas: unidades que permiten la creacin de tipos genricos
o parametrizados Son plantillas que sirven para construir subprogramas
y paquetes y que constituye el mecanismo principal para construir componentes de software reutilizable
Ada es un lenguaje que soporta el tipo abstracto de datos identificado como
mdulo en una entidad denominada paquete Un paquete representa en Ada la
idea de la encapsulacin, que es la clave para la abstraccin de datos
El paquete en Ada representa el nivel ms alto de abstraccin del programa
y acta como un mdulo La ocultacin de datos se iealiza a travs del uso de
tipos private (privado) o limited private (privado limitado) L.as operaciones de asignacin y verificacin de igualdad son las nicas operaciones que
estn definidas en el lenguaje para tipos privados Para tipos privados limitados no existen operaciones predefinidas proporcionadas por el lenguaje El
programador debe prever todas las operaciones soportadas, incluyendo asignacin y verificacin de igualdad

54

Modularidad tipos abstractos de datos

Programacin orientada a objetos

Ada divide el paquete en dos construcciones sintcticamente independientes: la especificacin del paquete y el cuerpo del paquete El contenido de la
especificacin es muy similar al mdulo de definicin (DEFINITION MODULE)
en Modula-2 El cuerpo se corresponde al mdulo de implementacin (IMPLEMENTATION MODULE)

package body TADPila is -cuerpo

Especificacin del paquete

procedure Sacar (p: in out Pila, x: out integer) is


begin
Cima : = Cima-1;
x! = P(Cima+l);
end Sacar;
begin inicializacionec
Cima : = 1;
end TADPila;

La especificacin del paquete tiene la siguiente sintaxis.


package <nombrepaquete> is
citemc declarativos>
[private
citems declarativos>l
end <nombrepaquete>

La especificacin tiene dos partes

Visible. Los componentes definidos en la parte visible son accesibles


fuera de la especificacin del paquete.
Privada La parte privada de la especificacin del paquete no es accesible a los clientes del paquete

Cuerpo del paquete

El cuerpo del paquete contiene las definiciones de los componentes que estn
ocultas a los clientes del paquete Uii cuerpo del paquete se puede definir en un
mdulo separado de la especificacin del paquete La sintaxis es:
package body <nombrepaquete> is
<declaraciones>
.:impl ementacin subprogramas>
[manejador de excepciones1
begin <inicializaciones>
end <nombrepaquete>

As, el tipo abstracto P i l a ms simple (slo el procedimiento METER y la


funcin SACAR) se escribira as:
package TADPila is --ewecificacin
Utilizado para declarar
type Pila ic private;
~nctanciade la c l a , s e
procedure METER(x:integer, p: in out Pila);
procedure SACAR (p: in out Pila x : out integer);
private
max:constant : = 100;
type Pila ic record
P: array(1 Max) o f integer;
Interfaz privado
Cima:integer range O max : = 0;
end record;
end Pila;

55

procedure Meter(x:integer, p: in out Pila) ic


begin
Cima : = Cimatl;
PlCirna) := x;
end Meter;

Los paquetes permiten ocultar a los usuarios de los mismos los objetos
internos de los mismos. L.os tipos privados nos permiten ocultar a los usuarios
de los mismos los detalles de construccin de los tipos Ada soporta dos tipos
de datos: privados y privados limitados

2.8.1. Tipos privados


La parte de la especificacin que est antes de la palabra reservada p r i v a t e es
la parte visible y la informacin est disponible fuera del paquete Despus de
pr i v a t e se tienen que dar los detalles de los tipos declarados como privados y
dar los valores iniciales de las constantes definidas corresnondienteq
Las caractersticas adicionales en la especificacin de un paquete que expoita un tipo privado son:
~A~

La declaracin, en la parte pblica de la declaiacin, de uno o ms tipos


privados Cada declaracin debe ser de la f0rma:
typeidentificador i s p r i v a t e

Una seccin a continuacin de la palabra reservada pr i v a t e y terminada en end, al final de la especificacin, en la que se declaran los detalles de
implementacin del tipo o tipos privados
As, por ejemplo, la seccin de especificacin de un tipo de datos abstracto
P i l a s es:
package Pilas is
--comentarios
--un paquete que exporta un tipo abstracto Pila de enteros
type Pila-ent is private;
procedure Iniciar (S:in out Pila-ent);
procedure Meter (S:in out Pila-ent; 1nst:integer);
procedure Sacar (S:in out Pila-ent, x: out integer);
function Cima (P:Pila-ent) return integer;
function Es-vaca (%:Pila-ent) return baolean;
function Es-llena (S:Pila_ent) return boolean;

56

Modularidad tipos abstractos de datos

Programaoon or~entadaa objetos

lirniteqila: constant := 100:


s~btyperangosila is integer range 1 limitegila;
type Pila-ent is
record
Pila-array:array (rangosila) o integer;
Cima:rango-cima;
end record;
end P ~ l a s ;

Las nicas operaciones disponibles en objetos de tipo privado son igualdad


y asignacin

2.8.2. Tipos privados limitados


Las operaciones disponibles para un tipo privado pueden restringirse completamente a las especificadas en la parte visible del paquete Esto se consigue
declarando el tipo como limitado, al mismo tiempo que privado, del siguiente
modo:
type t is limited private;

La ventaja de hacei que un tipo privado limitado es que el programador del


paquete tiene un control completo sobre los objetos del tipo Se puede vigilar
la copia de recursos, etc As, un tipo P i l a definido como un tipo privado
(pr i v a t e) limitado:
package Pila ic
type Pila-ent is limited Private;
procedure Iniciar (S:in out Pila-ent);
procedure Meter (S: in out Pila-ent; valor-int:integer);
procedure Sacar (S: in out Pila-ent, x: out integer);
procedure Cima (S: Cima) return integer;
function Es-vacia (S: Pila-ent) return boolean;
function Es-llena ( S : Pila-ent) return boolean;
function " = " (izda, dcha: Pila-ent) return boolean;
private
Max : constant := 100;
type Vector-~ntero ic array (Integer range o )of integer:
type Pila-ent. is
record
P: Vector-Entero (1 .Max);
Cima:Integer range O Max : = O ;
end record;
end;

Cuando una variable se declara como tipo privado limitado, no estn disponibles ni las operaciones predefinidas de igualdad ni de asignacin. Si se
requieren, se puede definir una nueva funcin =, que slo compara los elemen-

57

tos significativos, pero el operador de asignacin := no se puede redefinir, y en


consecuencia, si se requiere una operacin de asignacin, habr que declarar un
procedimiento especial a~ignai

2.9. TIPOS ABSTRACTOS DE DATOS EN C


El lenguaje C proporciona algn soporte para abstraccin de datos, aunque
sta es independiente de la implementacin particular La nica estructura de
programa definida en el lenguaje es la funcin, que es un subprograma que
puede poseer parmetros de slo lectura y generalmente devuelve un valor
mediante la sentencia return Las implementaciones estndar de C reconocen
una estructura de ms alto nivel -tipo f ile-, que es simplemente un archivo
que contiene cdigo fuente El archivo en C es la unidad de compilacin; al
igual que el mdulo, los archivos son unidades de compilaciii De este modo,
la mayora de los programas se componen de difeientes archivos compilados
separadamente Sin embargo, esta propiedad se convierte normalmente en un
inconveniente, ya que C, al contrario que sus rivales Modula-2 y Ada, no es
capaz de realizar verificacin de tipos durante el proceso de compilacin separada: es decir, cuando se disponen de varios archivos, no existen frmulas
claras que permitan definir dicha verificacin,
El interfaz del mdulo utilizado es la declaracin del archivo de cabecera i h),que mezcla en el archivo fuente merced al preprocesador aquellas
declaraciones de funciones incluidas en los citados archivos No existe en C
ninguna estructura para encapsular datos y funciones en una sola entidad
Normalmente, un programa C se organiza en uno o ms archivos fuente o
mdulos Cada archivo tiene una estinctura similar, con comentarios, directivas de preprocesador, declaraciones de variables y funciones, y sus definiciones
Normalmente se situar cada grupo de variables y funciones relacionadas en un
nico archivo fuente Algunos archivos son simplemente un conjunto de declaraciones que se utilizan en otros archivos a travs de la directiva # i n c l u d e del
preprocesador C Estos archivos, ya citados, se conocen como archivos de cabecera y sus nombres terminan con la extensin , h y constituyen la especificacin
del TAD Las operaciones indicadas en la seccin de especificacin han de ser
implementadas; la opcin ms segura es un archivo independiente con un sufijo
o extensin c Como C no soporta el tipo de dato clase que implementa en
una nica unidad los datos y operaciones que manipulan los datos, la implementacin del tipo abstracto de datos se realiza mediante t y p e d e f , los datos
con s t r u c t y la impleinentacin de las operaciones con un conjunto de
funciones
Un ejemplo de un TAD que representa un punto en un sistema de coordenadas rectangulares podra ser:
especificacin

implementacin

# include "punto L'


4% define CANEVAS-LONG 10000

# include <rnath h>


# include "punto h

typedef chort int Coord;

# define norma(x) (

58

Modularidad tipos abstractos de datos

Prograrnacion orientada a objetos

Coord
punto;

X,

float real(comp1ejo c )
return c r;
1

long dx=pl x - p2 x
dy=pl y - p2 y ;
return sqrt (dx*dx+dy*dy);

float imag(comp1ejo c )
return c i;

Punto Dlstancla (Punto pl

typedef struct i

Y;

double Distancia (Punto pl.


Punto p2 1 .
/*
restantes funciones * /

1
/*

Punto p2)

restantes ~mplementaciones* /

1
complejo sumar (complejo a , complejo b)
complejo c;
c r = a r + b r ;
c i = a i + b i ;

2.9..1. Un ejemplo de un tipo abstracto de datos en C


Definir un tipo abstracto de datos complejo en C que represente nmeros
complejos (datos y operaciones sobre nmeros complejos: parte real, parte imaginaria, sumar, restar, igualdad, multiplicar y dividir)
Un nmero complejo z tiene parte real y parte imaginaria:

return

C;

complejo restar (complejo a, complejo b)


complejo c;
c r = a r - b r ;
c i = a i - b i :
return c;

complejo multiplicar(comp1ejo a , complejo b)


complejo c;
c r = a r * b r - a i * b i ;
c i = a r * b i - a i * br:
return C ;

complejo nuevo_complejo(float x, float y);


float real(comp1ejo c) ;
float imag(comp1ejo c);
complejo sumar (complejo a, complejo b) ;
complejo rectar(comp1ejo a, complejo b);
int igual(comp1ejo a, complejo b);
complejo multiplicar(comp1ejo a , complejo b);
complejo dividir(comp1ejo a, complejo b);

complejo dividir (complejo a , complejo b)


com~leio
- . c .:
float denom = b r * b . r + b.i * b i;
C r = ( a r * b r + a i * b iildenom:
c i = (a i * b r - a r * bi)/denom;
return C :

Una vez definido el tipo de dato coinplejo, se puede invocar a los mismos
dentro de un programa principal

#endi

Los cuerpos de las funciones se implementan en el archivo c o m p l e x c:


/ * FICHERO: principa c * /
/ * FICHERO: complex c * /

#include '"complexh"

#include "complex h"

Itifndef COMPLEX
#define COMPLEX

complejo nuevo_complejo(float x , float y)


complejo c;
C r = x;
c i = y;
return C ;

int igual(comp1ejo a , complejo b) {


return(a r == r r & & a i == b i);

/ * tipo abstracto de datos en C * /


/ * archivo: complex h * /

typedef struct
float r , i;
) complejo;

59

int main() {
complejo x , y, z ;

60

Modularidad tipos abstractos de datos

Programacin onentada a objetos

printf('y = (%f. %f)\n' really), imag(y)l;

return O;

C no permite definir los signos y - para trabajar con tipos definidos por
el usuario, cosa que s podr realizarse con C + + mediante la propiedad de
sobrecarga de operadores

2.10. TIPOS ABSTRACTOS DE DATOS EN C++


En C + + el equivalente del paquete o mdulo se denomina clase, y es el tipo de
dato que soporta la abstraccin de datos Una clase es un tipo de dato que
incluye datos y operaciones que manipulan esos datos La clase es la entidad
principal de los lenguajes de programacin orientados a objetos (C++, Smalltalk, Eiffel, etc),
Una definicin de una clase en C + + consta de miembros dato y funciones
miembro, a travs de las cuales se puede acceder a los detalles internos de la
clase Una clase se define como una estructura en C ( s t r u c t ) , con la diferencia
de que puede contener tres secciones: pblica, privada y protegida, y que puede
definir se con las palabras reservadas s t r u c t y c l a s s
As, la definicin de una clase (TAD) pila de caracteres (pila-carac) en
C + + es su especificacin, y su sintaxis es:
class pilocarac l
char lista[1001;
int cima-de-lasila;
public :
pila-carac(1 {cima-de-lasila
void meter (char);
void sacar (char * ) ;
char cima ( ) ;

61

La implementacin de la clase (los cuerpos de la funcin) se pueden declarar


dentro de una definicin de la clase, pero es ms frecuente incluir los prototipos
de la funcin en la especificacin y declarar los cuerpos de la funcin separadamente, aprovechando la propiedad de compilacin separada que posee el lenguaje C + + Adems, cada parte se compila en un archivo: la especificacin con
la extensin , h y la implementacin con la extensin , cpp
En el caso de la citada clase P i l a , los cuerpos de las funciones se declaran y
compilan por separado mediante el operador de resolucin de mbito (: :), que
permite asociar los nombres de las funciones miembro con la clase correspondiente As, los cdigos fuente seran:
void pi1a~carac::meterlcharx )
ilista[++cima-de-lasilal = x;)
void pila-carac::sacar(char * x )
{ * x = lista[cimode-lasila--];)
char pila-carac::cima()
lreturn l i s t a L c i m a ~ d e _ l a ~ i l ;}
a]

Los usuarios de la informacin declarada en una clase se conocen como


clientes Las variables de la clase pila-carac se pueden declarar y manipula1
por un cliente de la forma siguiente:
main ( )
1

pila-carac a , b;
char ch;

/ / se crean dos objetos de la clase

a meter(''); b rneter('g');
ch = a cima O ;

= -1);

);

La nueva clase pila-carac contiene las operaciones m e t e r , s a c a r Y


c i m a Las clases pueden incluir otras funciones miembro con igual nombre que
la clase y que se denominan constructores y destructores, cuya utilidad se ver
posteriormente (Captulo 6).
El encapsulamiento en C + + se consigue declarando todos los datos como
privados (en la seccin privada, por defecto las sentencias que vienen a continuacin de la llave de apertura hasta la primera clusula p u b l i c O
p r o t e c t e d ) . A la seccin privada slo se puede acceder mediante las funciones
miembro de la clase
La seccin pblica es accesible (visible) a cualquier otra clase y sus datos
pueden ser modificados por funciones miembros externas a la clase

2..10.1. Definicin de una clase Pila en C+

La clase P i l a se define en el archivo de cabecera p i l a h, de modo que podr


ser utilizado por otros programas La implementacin de la pila utiliza un
array i t e m s , que contiene los elementos de la pila, y un ndice c u e n t a s , que
contiene cuantos elementos existen realmente en la pila. Las funciones que
manipulan la pila son m e t e r , s a c a r , c i m a y v a c a Estas operaciones se
desea que estn disponibles a los usuarios de la pila y, por consiguiente, se
deben definir pblicas (mediante la palabra reservada p u b l i c ) , lo que significa
que cualquier usuario de la pila puede llamar a las diferentes funciones miembro que implementan las opeiaciones de la pila
Con el tipo s t r u c t , el acceso por omisin en pblico ( p u b l i c ) para todos
sus miembros. En la definicin de p i l a existe un prototipo especial denominado p i l a ( ) Cualquier funcin miembro con el mismo nombre que el tipo dato
es un constructor Un constructor se llama automticamente siempre que crea-

Modu1ar;dad tipos abstractos de datos

mos una instancia de un tipo de dato particular Su trabajo es inicializar los


campos dato dentro de un objeto, ahorrando al programador la molestia de
llamar a una rutina de inicializacin especfica De modo similar, se puede
especificar un destructor, una funcin miembro con el mismo nombre que la
clase, con un smbolo
delante

//archivo pila h
//definicin de una pila, con operaciones
conct int MAXPILA = 100;

Un programa que invieite un flujo de enteros:


//utilizar pila para invertir un flujo de enteros
//archivo inver cpp
#include iioctream h>
#include "pila h"
main ( )

i
pila S ;
int i;

//tamao por defecto de la pila

struct pila

while (cin >> i)


c meter(i) ;
for ( ; ! S vacia0; s sacar())
cout < c s cima0 c c '\n";
return 0;

i
private:
int cuenta;
int itemsIMAXPILA1;
public:
pila();
void met.er(int item);
void sacar ( ) ;
int cima ( ) ;
int vaca ( ) ;

//nmero de elementos de la pila


//definicin de la pila
//inicializar pila, constructor
//meter elementos en la pila
//quitar elementos de la pila
//devuelve elemento cima de la pila
//la pila est vaca?

Las operaciones de la pila implementadas en el cuerpo de la clase:


//definicin de la pila: pila cpp
//

#include "pila h"


pila: :pila0

//inicializa la pila a vaca

i
cuenta = 0;

1
void pila::meter(int item) //meter un elemento en la pila
items[cuenta++l = item;

1
vaid pila: :sacar( )

//quitar elemento superior de la


//pila

//ARCHIVO: pila h
//Interaz de una pila de enteros
#ifndef PILA
#define PILA
class pila i
private:
const unsigned int maximo;
int cuenta;
int * itemc;
public:
pila0;
-pila(1 ;
void meter(int item) ;
void cacar ( ) ;
int cima();
int vaca ( 1 ;

1;

//ARCHIVO: pila cpp


#include "pila,h "

return itemc [cuenta-11;

1
int pila::vacia()

I
return cuenta == 0;

//?est la pila vaca?

//meter entrada en la pila


//vicualizar pila

El ejercicio anterior se puede implementar mediante el tipo ciass La


compilacin separada se consigue con el archivo de cabeceia pila h, el archivo de implementacin de funciones pila cpp y el programa principal que
hace uso del archivo pila.h

1
//devuelve elemento superior de la
//pila

//crear una pila

Cuenta--;

int pi1a::cirnaO

63

pila: :pila0
maximo (100)
cuenta(0) i
itemc = new int [maximo];
)

64

Modulandad tipos abstractos de datos

Programacron orientada a obletos

En la mayora de los lenguajes de progiamacin orientados a objetos, los


tipos abstractos de datos se implementan mediante clases (unidades en Pascal,
mdulos en Modula-2 paquetes en Ada).
En este captulo se analizan y describen las implementaciones de tipo abstractos de datos en los lenguajes Turbo Pascal (versiones 5 5 a 7 ) , Modula-2,

pila: :-pila() (
delete items;

1
void pila::meter(int itern)
itemc [cuenta++] = item;

int pila: :sacar1)


cuenta--;
1

65

Ada, C y C + +

EJERCICIOS

int pila: :cima0 I


return itemc[cuenta-11:

21

Construii un tipo abstracto lista enlazada de nodos que contienen enteros

int pila: :vaciaO (


return cuenta == 0;
1

El operador de resolucin de mbito (::) permite asociar una funcin


miembro con su clase, y ha de definirse as cuando se implementa el cuerpo de
la funcin
//ARCHIVO:

2.2. Disear un tipo abstracto de datos pila de nmeros enteros y que al


menos soporte las siguientes operaciones:
Boi rar:
Copiar:
Meter:
Sacar:
Longitud:

principa cpp

#include cioctream h>


#include "pila,h"
int m a i n 0 i

Llena:

pila s;
int i:
for

(;

c i n . g o o d 0 ; cin >> ii)

c meter();
C O U ~i<
'NUMEROS

Igual:
I N V E R T I D O S " << endl;

for ; c v a c i a 0 ; S sacar01
cout << s c i m a 0 .:< endl;

Eliminar todos los nmeios de la pila


Hace una copia de la pila actual
Aadir un nuevo elemento en la cima de la pila,
Quitar un elemento de la pila
Devuelve un nmero natural igual al nmero de objetos de la
pila
Devuelve verdadero si la pila est llena (no existe espacio libre
en la pila)
Devuelve ve~daderosi la pila est vaca y falso en caso contrario
Devuelve verdadero si existen dos pilas que tienen la misma
profundidad y las dos secuencias de nmeros son iguales
cuando se comparan elemento a elemento desde sus respectivas cimas de la pila; fa150 en caso contrario

return O ;

RESUMEN
Este captulo examina el concepto fundamental de la orientacin a objetos, el
tipo abstracto de datos Los tipos abstractos de datos (TAD) describen un
conjunto de objetos con la misma representacin y comportamiento Los
tipos abstractos de datos representan una separacin clara entre la interfaz
externa de un tipo de datos y su implementaciii interna La implementacin
de un tipo abstracto de datos est oculta Por consiguiente, se pueden utilizar
implementaciones alternativas para el mismo tipo abstracto de datos sin cambiar su interfaz

23

Crear un tipo abstracto c o l a que sirva para implementar una estiuctura


de de datos cola

2.4. Ciear un TAD para representar:


Un vector (repiesentacin grfica y operaciones)
Una matriz y sus diferentes operaciones
Un nmero complejo y sus diferentes operaciones

2.5. Crear un TAD que lepresente un dato tipo cadena (striizg) y sus diversas
operaciones: clculo, longitud, buscar posicin de un carcter dado, concatenai cadenas, extraer una subcadena, etc

Conceptos fundamentaies de programacin orientada a objetos

67

3..1. PROGRAMACION ESTRUCTURADA

CONCEPTOS FUNDAMENTALES
DE PROGRAMACION
ORIENTADA A OBJETOS
CONTENIDO
3 1
3,2
3,3
34
3 5
3 6

Programacin estructurada
Qu e s la programacin orientada a objetos?
Clases
Un mundo de objetos
Herencia
Comunicaciones entre objetos: los mensajes
3 7 . Estructura interna de un objeto
3 8 Clases
3 9 . Herencia y tipos
3 1 0 AnulaciniSustitucin
3 , 1 1 Sobrecarga
3 1 2 Ligadura dinmica
3 1 3 Objetos compuestos
3 , 1 4 Reutilizacin con orientacin a objetos
3 15. Polimorfismo
RESUMEN

La programacin estructurada se emplea desde el principio de la dcada de


los setenta y es uno de los mtodos ms utilizados en el campo de la programacin
La tcnica descendente o el refinamiento sucesivo comienza descomponiendo
el programa en piezas manejables ms pequeas, conocidas como funrioizes
(subrutinas, subprogramas o procedimientos), que realizan tareas menos complejas Un programa estructurado se construye rompiendo el programa en
hnciones Esta divisin permite escribir cdigo ms claro y mantener el control
sobre cada funcin
Un concepto importante se introdujo con la programacin estructurada, ya
comentado anteriormente: la abstraccidrz, que se puede definii como la capacidad para examinar algo sin preocuparse de sus datos internos En un programa
estructurado es suficiente conocer que un procedimiento dado realiza una tarea
especifica El cmo se realiza esta tarea no es importante, sino conocer cmo se
utiliza correctamente la funcin y lo que hace

Funcin

Figura 3 , , 1 Programa estructurado

La programacin orientada a objetos e s un importante conjunto de tcnicas que pueden utilizarse para hacer el desarrollo de programas ms eficientes, a la par que mejora la fiabilidad de los programas de computadora En la programacin
orientada a objetos, los objetos son los elementos principales
de construccin Sin embargo, la simple comprensin de lo
que es un objeto, o bien el uso de objetos en un programa, no
significa que est programado en un modo orientado a objetos Lo que cuenta e s el sistema en el cual los objetos se interconectan y comunican entre si
En este texto nos limitaremos al campo de la programacin, pero e s tambin posible hablar de sistemas de administracin de bases de datos orientadas a objetos, sistemas operativo~orientados a objetos, interfaces de usuarios orientados
a objetos, etc

A medida que la complejidad de un programa crece, tambin crece su independencia de los tipos de datos fundamentales que procesa En un programa
estructurado, las estructuras de datos de un programa son tan importantes
como las operaciones iealizadas sobre ellas Esto se hace ms evidente a medida que crece un programa en tamao L.os tipos de datos se procesan en
muchas funciones dentro de un programa estructurado, y cuando se producen
cambios en esos tipos de datos, las modificaciones se deben hacer en cada
posicin que acta sobre esos tipos de datos dentro del programa Esta tarea
puede ser frustrante y consumir un tiempo considerable en programas con
millones de lneas de cdigo y centenares de funciones
En un programa estructurado, los datos locales se ocultan dentro de funciones y los datos compartidos se pasan como argumentos (Fig 32)

68

Conceptos fundamentaies de programacin orientada a objetos

Programacin orientada a objetos

69

3.1.,1. Desventajas de la programacin estructurada


Variables globales

Accesibles, por cualquier funcin

D
Variables locales

Variables locales

Funcin A

Funcin B
--

Accesible slo por funcin B

Accesible slo por funcin A

Figura 3 2 Variables globales y locales


Otro problema es que, dado que muchas funciones acceden a los mismos
datos, el medio en que se almacenan los datos se hace ms critico La disposicin de los datos no se pueden cambiar sin modificar todas las funciones que
acceden a ellos Si por ejemplo se aaden nuevos datos, se necesitar modificar
todas las funciones que acceden a los datos, de modo que ellos puedan tambin
acceder a esos elementos

Adems de los inconvenientes citados anteriormente, comentaremos algunos


otros que influyen considerablemente en el diseo
Cuando diferentes programadores trabajan en equipo para disear una
aplicacin, a cada programador se le asigna la construccin de un conjunto
especfico de funciones y tipos de datos Dado que los diferentes programadores
manipulan funciones independientes que relacionan a tipos de datos compartidos mutuamente, los cambios que un programador hace a los datos se deben
reflejar en el trabajo del resto del equipo Aunque los programas estructurados
son ms fciles de disear en grupo, los errores de comunicacin entre miembros de equipos pueden conducir a gastar tiempo en rescritura
Por otra parte, los lenguajes tradicionales presentan una dificultad aadida:
la creacin de nuevos tipos de datos Los lenguajes de programacin tpicamente
tienen tipos de datos incorporados: enteros, coma flotante, caracteres, etc Cmo inventar sus p~opiostipos de datos? Los tipos definidos por el usuario y la
facilidad para crear tipos abstractos de datos en determinados lenguajes es la
propiedad conocida como extensibilidad Los lenguajes tradicionales no son
normalmente extensibles, y eso hace que los programas tradicionales sean ms
complejos de escribir y mantener
En resumen, con los mtodos tradicionales, un programa se divide en dos
componentes: procedimientos y datos Cada procedimiento acta como una caja
negra Esto es, es un componente que realiza una tarea especifica, tal como
convertir un conjunto de nmeros o visualizar una ventana Este procedimiento permite empaquetar cdigo programa en funciones, pero qu sucede con los
datos? Las estructuras de datos utilizadas en programas son con frecuencia
globales o se pasan explcitamente con parmetros

3.2. QUE ES LA PROGRAMACION ORIENTADA


A OBJETOS?

Funcin

Figura 3 3

Funcin

1 1

Funcin

1 1

Funcin

Descomposicin de un programa en mdulos (funciones)

Los programas basados en funciones son difciles de disear El problema es


que sus componentes principales -funciones y estructuras de datos- no modelan bien el mundo real Por ejemplo, supongamos que se est escribiendo un
programa para crear los elementos de un interfaz grfico de usuario: mens,
ventanas, cuadros de dilogo, etc Qu funciones se necesitarn? Qu estructuras de datos? La solucin sera ms aproximada si hubiera una correspondencia lo ms estrecha posible entre los mens y ventanas y sus correspondientes elementos de programa

Grady Booch, autor del mtodo de diseo orientado a obletos, define la piogramac~noi lentada a objetos (POO) como
un mtodo de implementacin en el que los programas se organizan como colecciones cooperativas de objetos, cada uno de los cuales representan una instancia
de alguna clase, y cuyas clases son todas miembros de una jerarqua de clases
unidas mediante relaciones de hetencias
Existen tres importantes partes en la definicin: la programacin orientada
a objetos 1) utiliza objetos, no algortmicos, como bloques de construccin
lgicos (jerarquia de objetos); 2) cada objeto es una instancia de una clase, y 3)
las clases se relacionan unas con otras por medio de relaciones de herencia

' Booc~,Giady: Anlisis y diseo orientado a objetos coii aplicacioi~es 2' edicidn AddisonWesleypaz de Santos, 1995

70

1l

Programanon orientada a objetos

Un programa puede parecer orientado a objetos, pero si cualquiera de estos


elementos no existe, no es un programa orientado a objetos Especificamente, la
programacin sin herencia es distinta de la programacin orientada a objetos;
se denomina programacin con tipos abstractos de datos o piograrnacin basada
en objetos
El concepto de objeto, al igual que los tipos abstractos de datos o tipos
definidos por el usuario, es una coleccin de elementos de datos, junto con las
funciones asociadas utilizadas para operar sobre esos datos Sin embargo, la
potencia real de los objetos reside en el modo en que los objetos pueden definir
otros objetos Este proceso, ya comentado en el Captulo 1: se denomina herencia y es el mecanismo que ayuda a construir programas que se modifican
fcilmente y se adaptan a aplicaciones diferentes
Los conceptos fundamentales de programacin son: objetos, clases, herencia, rnensajes y polimorfisino

3.2.,1.. El objeto
La idea fundamental en los lenguajes orientados a objetos es combinar en una
sola unidad datos v funciones que operan sobre esos datos Tal unidad se denomina objeto Por consiguiente, dentro de los objetos residen los datos de los
lenguajes de programacin tradicionales, tales como nmeros, ariays, cadenas
y registros, as como funciones o subrutinas que operan sobre ellos
Las funciones dentro del objeto (funciones miembro en C + + , nz4todos en
Object-Pascal y Smalltalk) son el nico medio de acceder a los datos privados
de un objeto Si se desea leer un elemento datos de un objeto se llama a la
funcin miembro del objeto Se lee el elemento y se devuelve el valor No se
puede acceder a los datos directamente Los datos estn ocultos, y eso asegura
que no se pueden modificar accidentalmente por funciones externas al objeto
Funciones externas

Procedimientos externos

Datos

Funcin

Datos

Funcin
1

Figura 3 4

Pblico
El modelo objeto,

Privado

Conceptos fundamentales de programacin orientada a objetos

71

L.os datos y las funciones (procedimientos en Object-Pascal) asociados se dicen


que estn eizcapsulados en una nica entidad o mdulo La encapsulacin de
datos y ocultacin de datos son trminos importantes en la descripcin de
lenguajes orientados a objetos
Si se desea modificar los datos de un objeto, se conoce exactamente cules
son las funciones que interactan con el mismo Ninguna otra fuiicin puede
acceder a los datos Esta caiacteristica simplifica la escritura, depuracin y
mantenimiento del programa

3.2.2. Ejemplos de objetos


Qu clase de cosas pueden ser objetos en un progiama oiientado a objetos?
L.a respuesta est slo limitada a su imaginacin Algunos ejemplos tpicos
pueden ser:
Objetos fisicos
Aviones en un sistema de control de trfico areo
Automviles en un sistema de control de trfico terrestre
Casas
Eleineiztos de irzterfaces grficos de usuario
Ventanas
Mens
Objetos grficos (cuadrados, tringulos, etc),
Teclado,
Cuadros de dilogo
Ratn
Aizirnales
Animales veitebrados
Animales invertebrados
Pescados
Tipos de datos defirzidos poi el usuario
Datos con~plejos
Puntos de un sistema de coordenadas
Alimerztos
Carnes
Frutas,
Pescados
Verduras
Pasteles

Un objeto es una entidad que contiene los atributos que describen el estado
de un objeto del mundo real y las acciones que se asocian con el objeto del
mundo real Se designa por un nombie o identificado1 del objeto.
Dentro del contexto de un lenguaje orientado a objetos (LOO), un objeto
encapsula datos y los procedimientos/funciones (nz4todos.l que manejan esos
datos La notacin grfica de un objeto vara de unas metodologas a otras

72

rq

Programacin orientada a objetos

Conceptos fundamentales de programacin onentada a objetos

Atiibutos
Mtodos

Nombre del objeto

73

Datos o variables que caracterizan el estado de un objeto


Procedimientos o acciones que cambian el estado de un objeto

El objeto tetiene cierta informacin y conoce cmo tealizar ciertas operaciones La encapsulacin de operaciones e informacin es muy importante L.os
mtodos de un objeto slo pueden manipular directamente datos asociados con
ese objeto. Dicha encapsulacin es la propiedad que permite incluir en una sola
entidad (el mdulo u objeto) la iifoimaciiz (los datos o atributos) y las opeiaciones (los mtodos o funciones) que operan sobre esa info~macin

Informacin
operaciones
Y

Seccin
privada

Nombre
del objeto

Figura 3 7

Encapsulamiento de datos

Los objetos tienen un interfaz pblico y una representacin privada que


permiten ocultai la informacin que se desee al exterior

Atributos
Mtodos

lntertaz pblico

y operaciones
(c)
(d)
Figura 3 5 . Notaciones grficas de objetos: (a) Taylor; (b) Yourdon/Coad;
(c) OMT; (d) Booch,,

i . ; . . ._

Consideremos una ilustracin de un coche vendido por un distribuidor de


coches El identificado1 del objeto es Cochel Los atributos asociados pueden
ser: nmero de m a t r i c u l a , f a b r i c a n t e , precio-compra, p r e c i o a c t u a l , fecha-compra El objeto Cochel se muestra en la Figura 3 6

Figura 3 8

u
Figura 3 6 El objeto Cochel

Representacin

lnterfaz publico de un objeto,

3..2.3.Mtodos y mensajes
Un programa orientado a objetos consiste en un nmeio de objetos que se
comunican unos con otros llamando a funciones miembro Las funciones
miembro (en C + i ) se denominan mtodos en otros lenguajes orientados a
objetos (tales como Smalltalk y Turbo Pascal 5 516 0170)
Los procedimientos y funciones, denominados mtodos o funciones miemb~o,
residen en el objeto y determinan cmo actan los objetos cuando reciben un
mensaje Un merzsaje es la accin que hace un objeto Un mtodo es el procedimiento o funcin que se invoca para actuar sobre un objeto Un mtodo especifica cmo se ejecuta un mensaje
El conjunto de mensajes a los cuales puede responder un objeto se denomina protocolo del objeto Por ejemplo, el protocolo de un icono puede constar de

Conceptos fundamentales de programacin orientada a objetos

74

75

Programacin orientada a objetos

3..3. CLASES

Objeto

Mtodos

Figura 3 9

Mtodos y mensajes de u n objeto

mensajes invocados por el clic de un botn del ratn cuando el usuario localiza
un puntero sobre un icono
Al igual que en las cajas negras, la estructura interna de un objeto est
oculta a los usuarios y programadores Los mensajes que recibe el objeto son
los nicos conductos que conectan el objeto con el mundo externo Los datos
de un objeto estn disponibles para ser manipulados slo por los mtodos del
propio objeto
Cuando se ejecuta un programa orientado a objetos ocurren tres sucesos,
Primero, los objetos se crean a medida que se necesitan Segundo, los mensajes
se mueven de un objeto a otro (o desde el usuario a un objeto) a medida que el
programa procesa informacin internamente o responde a la entrada del usuario Tercero, cuando los objetos ya no son necesarios, se borran y se libera la
memoria
L.a Figura 3 10 representa un diagrama orientado a objetos,

Una clase es la descripcin de un conjunto de objetos; consta de mtodos y


datos que resumen caractersticas comunes de un conjunto de objetos Se pueden definir muchos objetos de la misma clase Dicho de otro modo, una clase es
la declaracin de un tipo objeto
Las clases son similares a los tipos de datos y equivalen a modelos o plantillas que describen cmo se construyen ciertos tipos de objetos Cada vez que se
construye un objeto a partir de una clase, estamos creando lo que se llama una
instancia de esa clase Por consiguiente, los objetos no son ms que instancias
de una clase Una instancia es una variable de tipo objeto En general, instancia
de una clase y objeto son trminos intercambiables
-..

. . . - -.-

-- -

... .

Un objeto cs una instancia de unti cl.isc.


.

..

3.3..1. Implementacin de clases en lenguajes


Supongamos una clase Punto que consta de los campos dato (coordenadas x
e y) y los campos funcin (mtodos leer dichas coordenadas x e y)

Cool denadas

Objeto 2

/ Funcin
Figura 3.,10 Diagrama orientado a objetos

miembro

..

Cada vez que se construye un objeto de una clase, se crea una instancia de
esa clase Los objetos se crean cuando un mensaje de peticin de creacin se
recibe por la clase base

c l a s e Punto

Objeto 3

-.

Mtodos
Fijar
Leer x
Leer y

Obletos de la clase P u n t o

Mdtodos 1

Mdtodo, 2

Mtodos 3

obleto 1

obleto 2

objeto 3

76

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

77

En Turbo Pascal se define una clase (en terminologa de Borland se


denomina objeto) con la palabra object
tme
inomre-clase, = object
<lista de campos de datos,
<lista de cadenas de funciones y procedimientos>
end;

En realidad, una clase es un tipo de dato definido por el usuario que determina las estructuras de datos y operaciones asociadas con ese tipo. Dicho de
otro modo, una clase es urza coleccin de objetos similares La definicin de una
clase no crea ningn objeto, de igual modo que la declaracin de variables
tampoco crea variables

type Punto =

X,Y

3.3.,2.Sintaxis

class Punto
int x int v:
public:
void fijarXY (int a , ~ n t
b)
(

x = a;
y = b:

(return x; 1
(return y;1

1;

La sintaxis anterioi ha definido la clase punto, pero no ha creado ningn


objeto Para crear un objeto de tipo P u n t o tendr que utilizarse una declaracin del tipo correspondiente, al igual que se declara cualquier variable de un
tipo incorporado C + +
//

Punto;

3.,4.. U N MUNDO DE OBJETOS

En C++ se puede declarar una clase de la siguiente forma:

1
int leerX 0
int leerY 0

object

. Integer,

procedure operar,
end;
var p

int x;
int pesetas;

Punto P:

y el elemplo de un objeto P u n t o

se define una variable de tipo Punto

Una de las ventajas ineludibles de la orientacin a objetos es la posibilidad de


reflejar sucesos del mundo real mediante tipos abstractos de datos extensibles a
objetos As pues, supongamos el fenmeno corriente de la conduccin de una
bicicleta, un automvil, una motocicleta o un avin: usted conoce que esos
vehculos comparten muchas caractersticas, mientras que difieren en otros
Por ejemplo, cualquier vehculo puede ser conducido: aunque los mecanismos
de conduccin difieren de unos a otros, se puede generalizar el fenmeno de la
conduccin En esta consideracin, enfrentados con un nuevo tipo de vehculo
(por ejemplo una nave espacial), se puede suponer que existe algn medio para
conducirla Se puede decir que vehiculo es un tipo base y nave espacial es un
tipo derivado de ella,
En consecuencia, se puede crear un tipo base que representa el comportamiento y caractersticas comunes a los tipos derivados de este tipo base
Un objeto es en realidad una clase especial de variable de un nuevo tipo que
algn programador ha creado. Los tipos objeto definidos por el usuario se comportan como tipos incorporados que tienen datos internos y operaciones externas Por ejemplo, un nmero en coma flotante tiene un exponente, mantisa y bit
de signo y conoce cmo sumarse a s mismo con otro n m e ~ ode coma flotante
Los tipos objeto definidos por el usuario contienen datos definidos por
el usuario (caracteristicas) y operaciones (comportamiento) Las operaciones

Conceptos fundamentales de programacin orientada a objetos

78

79

Programanon orientada a objetos

definidas por el usuario se denominan mtodos Para llamar a uno de estos


mtodos se hace una peticin al objeto: esta accin se conoce como enviar un
mensaje al objeto Por ejemplo, para detener un objeto automvil se enva un
mensaje de parada (stop) Obsrvese que esta operacin se basa en la nocin
de encapsnlacin (encapsulamiento): se indica al objeto lo que ha de hacer, pero
los detalles de cmo funciona se han encapsulado (ocultado)

3.4.1.

Definicin de objetos2

Un objeto (desde el punto de vista formal se debera hablar de clase), como ya se


ha comentado, es una abstraccin de cosas (entidades) del inundo real, tales que:
Todas las cosas del mundo real dentro de un conjunto -denominadas
irzrtancias- tienen las mismas caractersticas
Todas las instancias siguen las mismas reglas
Cada objeto consta de:
Estado (atributos)
Operaciones o comportamiento (mtodos invocados por mensajes)
Desde el punto de vista inforrntico, los objetos son tipos abstvactos de datos
(tipos que encapsulan datos y funciones que operan sobre esos datos)
Algunos ejemplos tpicos de objetos:

Nmero raciolzal
Estado (va101 actual)
Opeiaciones (sumar, multiplicar, asignar )
Vehculo
Estado (velocidad, posicin, precio ),
Operaciones (acelerar, frenar, parar, )
Colzjunto
Estado (elementos).
Operaciones (aadir, quitar, visualizar ),
Avin
Estado (fabricante, modelo, matrcula, nmero de pasajeros )
Operaciones (aterrizar, despegar, navegar )

3.4.2.

Identificacin de objetos

El primei problema que se nos plantea al analizar un problema que se desea


implementar mediante un programa orientado a objetos es identificar los obje""ando
se habla de modo genrico, en iealidad se debera hablar de CLASES,
dado que la clase
en el tipo de dato y objeto es s61o una instancia, ejemplar o caso de la clase Aqu mantenemos el
trmino objeto por conservar la rigurosidad de la definicin orientado a objetos, aunque en
realidad la definicin desde el punta de vista tcnico sera la clase

tos; es decir, qu cosas son objetos?; jcmo deducimos los objetos dentro del
dominio de la definicin del problema?
L.a identificacin de objetos se obtiene examinando la descripcin del problema (anlisis gramatical somero del enunciado o descripcin) y localizando
los nombres o clusulas nominales Normalmente, estos nombres y sus sinnimos
se suelen escribii en una tabla de la que luego deduciremos los objetos reales,
Los objetos, segn Shlaer, Mellor y CoadJYourdon, pueden caer dentio de
las siguientes categoras:
Cosas tangibles (avin, reactor nuclear, fuente de alimentacin, televisor,
libro, automvil).
Roles o papeles jugados o representados por personas (gerente, cliente,
empleado, mdico, paciente, ingeniero)
Organizaciones (empresa, divisin, equipo )
Incidentes (representa un suceso -evento- u ocurrencia, tales como vuelo, accidente, suceso, llamada a un servicio de asistencia tcnica )
Interacciones (implican generalmente una transaccin o contrato y relacionan dos o ms objetos del modelo: compras -comprador, vendedor,
artculo-, matrimonio -esposo, esposa, fecha de boda)
Especijkaciones (muestran aplicaciones de inventario o fabricacin: iefrigerador, nevera )
Lugares (sala de embarque, muelle de carga )
Una vez identificados los objetos, ser preciso identificar los atributos y las
operaciones que actan sobre ellos,
Los atributos describen la abstraccin de caractersticas individuales que
poseen todos los objetos

Matricula
Licencia del piloto
Nombre de avin
Capacidad de carga
Nmero de pasajeros

Nombre
Nmero de identificacin
Salario
Direccin
Nombre del departamento

Las operaciones cambian el objeto -su comportamiento- de alguna foima, es decir, cambian valores de uno o ms atributos contenidos en el objeto
Aunque existen gran nmero de operaciones que se pueden realizar sobre un
objeto, generalmente se dividen en tres grandes grupos3:
Operaciones que matnpulan los datos de alguna f o ~ m aespecfica (aadir,
borrar, cambiar formato )
Operaciones que realizan un clculo o proceso

' PRESSMAN,
Roger: 1izgeniei.a de1 rofrwaie Uii eofoque pi.dctico 3 " edicin McGraw-Hill, 1993

80

Programacion orrentada a obletos

Operaciones que comprueban (inonztoizzan)un objeto frente a la ocurrencia de algn suceso de control
La identificacin de las operaciones se realiza haciendo un nuevo anlisis
gramatical de la descripcin del problema y buscando y aislando los verbos del
texto

Conceptos fundamentales de programacin orientada a objetos

81

La caja se etiqueta con el nombre del objeto y representa el lmite o f~ontera


entre el interior y el exterior de un objeto
Objeto

Campos miembro

3.4..3. Duracin de los objetos

L.os objetos son entidades que existen en el tiempo; por ello deben ser creados o
instanciados (normalmente a travs de otros objetos) Esta operacin se hace a
travs de operaciones especiales llamadas constructores en C + + o inicializadores Estas operaciones se ejecutarn implcitamente por el compilador o
explcitamente por el prograinadol, mediante invocacin a los citados constructores

Funciones miembro

(zIIIr3

,
L,+
I

Interior

3..4.4. Objetos frente a clases. Representacin grfica


(Notacin de Ege)
Los objetos y las clases se comparan a val iables y tipos en lenguajes de programacin convencional Una variable es una instancia de un tipo, al igual que un
objeto es una instancia de una clase; sin embargo, una clase es ms expresiva
que un tipo Expresa la estructura y todos los procedimientos y funciones que
se pueden aplicar a una de sus instancias
En un lenguaje estructurado, un tipo i n t e g e r , por ejemplo, define la estructura de una variable enteia, por ejemplo una secuencia de 16 bits y los
procedimientos y funciones que se pueden realizar sobre enteros De acuerdo a
nuestra definicin de clase, el tipo i n t e g e r ser una clase Sin embargo, en
estos lenguajes de programacin no es posible agrupar nuevos tipos y sus
correspondientes nuevas funciones y procedimientos en una nica unidad En
un lenguaje orientado a objetos una clase proporciona este servicio
Adems de los trminos objetos y clases, existen otros trminos en orientacin a objetos Las variables o campos que se declaran dentro de una clase se
denominan datos nliembro en C + + ; otros lenguajes se refieren a ellos como variable~instancia Las funciones que se declaran dentro de una clase se denominan,funciones mieinbro en C++; otros lenguajes utilizan el tQmino mtodo Las
funciones y campos miembro se conocen como caracteristicas miembro, o simplemente mielnbros A veces se invierten las palabras, y las funciones miembros
se conocen como miembro funcin y los campos se denominan nlienlbro datos.
Es til ilustrar objetos y clases con diagramas4 La Figura 311 muestra el
esquema general de un diagrama objeto Un objeto se dibuja como una caja

Exterior

Figura 3 , 1 1 Diagrama d e u n objeto,

Un campo se dibuja poi una caja rectangular, una funcin por un hexgono
largo Los campos y funciones se etiquetan con sus nombres Si una caja rectangular contiene algo, entonces se representa el valor del campo para el objeto
dibujado Los campos y funciones miembro en el interior de la caja estn
ocultos al exterior, que significa estar encapsulados El acceso a las caractersticas de los miembros (campos y funciones) es posible a travs del interfaz
del objeto En una clase en C + + , el interfaz se construye a partir de todas las
caractersticas que se listan despus de la palabra reserva gublic; puede ser
funciones y campos
La Figura 3 12 muestra el diagrama objeto del objeto "holamundo" Se
llama Saludol y permite acceder a su estado interno a travs de las funciones
miembro pblicas cambiar y anunciar El campo miembro privado contiene
el valor ~ s t eos saludo1
Saludol

S2
Visualizar

Las nolaciones de clases y objetos utilizada en esta seccin se deben a Raimund K. Ege, que
las dio a conocer en su libro Progiai+iming in aii Object-Orieiired Enviroitmenr Academic Press (AP),
1992

Figura 3 12

El objeto Saludol

82

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

83

Cul es la diferencia entre clase y objeto?

Un objeto es un simple elemento, no importa lo complejo que pueda ser Una


clase, por el contrario, describe una familia de elementos similares. En la prctica, una clase es como un esquema o plantilla que se utiliza para definir o crear
objetos
A partir de una clase se puede definir un nmero determinado de objetos Cada uno de estos objetos generalmente tendr un estado particular
propio (una pluma estilogrfica puede estar llena, otra puede estar medio
llena y otra totalmente vaca) y otras caractersticas (como su color), aunque
compartan algunas operaciones comunes (como escribir o llenar su depsito de tinta)
L.os objetos tienen las siguientes caractersticas:

Se agrupan en tipos llamados clases


Tienen dato7 internos que definen su estado actual
Soportan ocultaciiz de datos
Pueden Izeredar propiedades de otros objetos
Pueden comunicarse con otros objetos pasando meiz~ajes
Tienen mtodos que definen su coinportamieizto

La Figura 3 13 muestra el diseo general de diagramas que representan a


una clase y a objetos peitenecientes a ella

3..4.,5.. Datos internos


Una propiedad importante de los objetos es que almacenan infoimacin de su
estado en forma de datos internos El estado de un objeto es simplemente el
conjunto de valores de todas las variables contenidas dentro del obieto en un
instante dado A veces se denominan a las variables que representan a los
objetos vaiiables de estado As poi ejemplo, si tuvisemos una clase ventana
en C + + :
clacs ventana i
int posx, posy;
int tipo-ventana;
int tipo-borde;
int color-ventana;
public:

rnove-hor
rnove-ver

Clase
);

Campo miembro

Funciones miembro

(int dir, int ang);


(int dir, int ang) ;

Figura 313. Diagrama de una clase,

Una clase es un tipo definido que determina las estructuras de datos y


operaciones asociadas con ese tipo L.as clases son como plantillas que describen cmo ciertos tipos de objetos estn construidos. Cada vez que se construye
un objeto de una clase, estamos creando lo que se llama una instancia (modelo
o ejemplar) de una clase y la operacin correspondiente se llama instanciacin
(creacin de instancias) Por consiguiente, los objetos no son ms que instancias
de clases En general, los trminos objeto e inrtai~ciade una clase se pueden
utilizar indistintamente

Las variables de estado pueden sei las coordenadas actuales de la ventana y


sus atributos de color actuales
En muchos casos, las variables de estado se utilizan slo indirectamente
As, en el caso del ejemplo de la ventana, suponga que una orden (mandato)
tpica a la ventana es:
reducir en 5 filas y 6 columnas

Esto significa que la ventana se reducir en tamao una cantidad dada por
5 filas y 6 columnas:
mensaje reducir

Afortunadamente, no necesita tener que guaidar la posicin actual de la


ventana, ya que el objeto hace esa operacin por usted La posicin actual se
almacena en una variable de estado que mantiene internamente la ventana
Naturalmente, se puede acceder a esta variable estado cuando se desee, enviando un mensaje tal conlo:
indicar posicion actual

84

Programacin

Conceptos fundamentales de programacin orientada a objetos

orientada a objetos

85

Clase base

3.4.6. Ocultacin de datos


Con el fin de mantener las caractersticas de caja negra de POO, se debe
considerar cmo se accede a un objeto en el diseo del mismo, Normalmente es
una buena prctica restringir el acceso a las variables estado de un objeto y a
otra informacin interna que se utiliza para definir el objeto, Cuando se utiliza
un objeto no necesitamos conocer todos los detalles de la implementacin Esta
prctica de limitacin del acceso a cierta informacin interna se llama ocultacin de datos
En el ejemplo anterior de ventana, el usuario no necesita saber cmo se
implementa la ventana; slo cmo se utiliza. Los detalles internos de la implementacin pueden y deben ser ocultados Considerando este enfoque, somos
libres de cambiar el diseo de la ventana (bien para mejorar su eficiencia o bien
para obtener su trabajo en un hardware diferente), sin tener que cambiar el
cdigo que la utiliza

Caracteristica B

Caracteristica X

Caracteristica W

Clase derivada

Clase derivada

Clase derivada

Figura 3.14 Jerarqua d e clases

3..5.HERENCIA
La encapsulacin es una caracterstica muy potente, y junto con la ocultacin
de la informacin, representan el concepto avanzado de objeto, que adquiere su
mayor relevancia cuando encapsula e integra datos, ms las operaciones que
manipulan los datos en dicha entidad Sin embargo, la orientacin a objetos se
caracteriza, adems de por las propiedades anteriores, por incorporar la caracterstica de herencia, propiedad que permite a los objetos ser construidos a
partir de otros objetos Dicho de otro modo, la capacidad de un objeto para
utilizar las estructuras de datos y los mtodos previstos en antepasados o
ascendientes. El objetivo final es la reutilizabilidad o reutilizacin (reu~ability)~,
es decir reutilizar cdigo anteriormente ya desarrollado
L.a herencia se apoya en el significado de ese concepto en la vida diaria As,
las clases bsicas o fundamentales se dividen en subclases Los animales se
dividen en mamferos, anfibios, insectos, pjaros, peces, etc La clase vehculo se
divide en subclase automvil, motocicleta, camin, autobs, etc El principio en
que se basa la divisin de clases es la jerarqua compartiendo caractersticas
comunes As, todos los vehculos citados tienen un motor y ruedas, que son
caractersticas comunes; si bien los camiones tienen una caja para transportar
mercancas, mientras que las motocicletas tienen un manillar en lugar de un
volante
Este trmino tambin se suele traducir por i.euialiilidad, aunque no es un trmino aceptado
por el Diccionario de la Real Academia Espaola

La herencia supone una clase base y una jerarqua de clases que contienen
las clases derivadas de la clase base Las clases derivadas pueden heredar el
cdigo y los datos de su clase base, aadiendo su propio cdigo especial y datos
a ellas, incluso cambiar aquellos elementos de la clase base que necesita sean
diferentes
No se debe confundir las relaciones de los objetos con las clases, con las
relaciones de una clase base con sus clases derivadas Los objetos existentes
en la memoria de la computadora expresan las caractersticas exactas de su
clase y sirven como un mdulo o plantilla Las clases derivadas heredan
caractersticas de su clase base, pero aaden otras caractersticas propias
nuevas

una

-.

-- ..- - . -.

-.

-1

clase hi,redu sus caracterstisas (datos y fiincioiics) de otra clase.


..-.

---.

.. -

..

As, se puede decir que una clase de objetos es un conjunto de objetos que
comparten caractersticas y comportamientos comunes Estas caractersticas y
comportamientos se definen en una clase base Las clases derivadas se crean en
un proceso de definicin de nuevos tipos y reutilizacin del cdigo anteriormente desarrollado en la definicin de sus clases base Este proceso se denomina programacin por herencia Las clases que heredan propiedades de una clase
base pueden a su vez servir como definiciones base de otras clases Las jerarquas de clases se organizan en forma de rbol

Conceptos fundamentales de programacin orientada a objetos

86

Programacin orientada a objetos

3.5..1. Sintaxis
1

En lenguaje C + + la propiedad de herencia se implementa con la siguiente


sintaxis:
class <derivadas>

<lista clases base>

87

Dado que derivada hereda todos los datos y mtodos de base, no se


necesita redefinirlos; simplemente indicar al compilador que desea derivar un
nuevo tipo (derivado) de un tipo base (base) y aadir el nuevo mtodo. L.a
herencia permite construir tipos de datos complejos sin repetir mucho cdigo
El nuevo tipo hereda unas caractersticas y comportamiento de un ascendiente
o antepasado Puede tambin reimplementar o sobrescribir cualquier mtodo
que elija Esta reimplementacin de mtodos del tipo base en los tipos derivados es fundamental el concepto de polimorfismo, que se ver ms tarde,

.:datos propios,
<funciones miembro propias>

En lenguaje Pascal orientado a objetos (versiones Turbo 5 5 a 7 O), la sintaxis de una clase (objeto en su terminologa) es:
tme

<nombre-clase, = object (clase ascendiente)


<campos propios de nuevo objeto>
<mtodos propios del nuevo objeto,
end;

As, por ejemplo, en C + + , si se crea una clase base:


class base

int x y;
public:
void hacerAlgo

1;

3.5.2.. Tipos de herencia


Existen dos mecanismos de herencia utilizados comnmente en programacin
orientada a objetos: lzerencia sinzple y herencia mltiple
En herencia simple, un objeto (clase) puede tener slo un ascendiente, o
dicho de otro modo, una subbase puede heredar datos y mtodos de una nica
clase, as como aadir o quitar compo~tamientosde la clase base Turbo Pascal
slo admite este tipo de herencia C + + admite herencia simple y mltiple
La lzerencia mltiple es la propiedad de una clase de poder tener ms de un
ascendiente inmediato, o lo que es igual, adquirir datos y mtodos de ms de
una clase
Una representacin grfica de los tipos de herencia con una clase base
genrica 01 se muestra en la Figura 3 16
La Figura 1 15 representa los grficos de herencia simple y herencia mltiple de la clase figura y persona,respectivamente

en Turbo Pascal se escribira la clase equivalente:


base = object
x , y : integer;
procedure hacerlgo;
end;

Se desea construir uii nuevo tipo derivado del tipo base existente, tal que el
tipo derivado sea idntico al tipo base, con una excepcin: extender base
aadiendo un mtodo llamado hacerotracosa Se construye una clase derivada En C++:
class derivada
public:

class base {

void hacerOtraCosa ( 1

1;

En Turbo Pascal,
derivada = object (base)
procedure hacerotracosa;
end;

Herencia simple

Herencia mltiple

Figura 3 1 5 Tipos de herencia

En la Figura 3 16 se muestian grficamente las relaciones de herencia, aprecindose fcilmente los dos tipos (simple y mltiple)
A primera vista, se puede suponer que la herencia mltiple es mejor que la
herencia simple; sin embargo, como ahora comentaremos, no siempre ser as

88

Conceptos fundamentales de programacin orientada a objetos

Programac~norientada a objetos

89

3.,6.. COMUNICACIONES ENTRE OBJETOS:

Herencia simple
Base (01)

LOS MENSAJES

(11) derivada de base (01)


(111) derivada de (11)
(12) derivada de base (01)
(13) derivada de base (01)
Herencia mltiple
Base (01)
(11) derivada de base (01)
(111) derivada de (11)
(12) derivada de (02)

Ya se ha mencionado en secciones anteriores que los objetos realizan acciones


cuando ellos reciben mensajes El mensaje es esencialmente una orden que se
enva a un objeto para indicarle que realice alguna accin. Esta tcnica de
enviar mensajes a objetos se denomina pasal. mensajes Los objetos se comunican entre s enviando mensajes, al igual que sucede con las personas Los
mensajes tienen una contrapartida denominada mtodos Mensajes y mtodos
son dos caras de la misma moneda Los mtodos son los procedimientos que se
invocan cuando un objeto recibe un mensaje En terminologa de programacin
tradicional, un mensaje es una llamada a una funcin Los mensajes juegan un
papel crtico en P O 0 Sin ellos los objetos que se definen no se podrn comunicar entre s Como ejemplo, consideramos enviar un mensaje tal como subir 5
lheas el objeto ventana definido anteriormente El aspecto importante no es
cmo se implementa un mensaje, sino cmo se utiliza
Consideremos de nuevo nuestro objeto ventana Supongamos que deseamos cambiar su tamao, de modo que le enviamos el mensaje
Reducir 3 columnas p o r la derecha

(12111) derivada de (12) y (111)


Figura 3 1 6

Herencia simple y multiple,

En los lenguajes de P O 0 -incluyendo Object-Pascal, Objective-C, Smalltalk y Acter- implementan slo herencia simple Eiffel y C + + (a partir de la
versin 2 O), por otra parte, soportan herencia mltiple,
En general, prcticamente todo lo que se puede hacer con herencia mltiple
se puede hacer con herencia simple, aunque a veces resulta ms difcil Una
dificultad surge con la herencia mltiple cuando se combinan diferentes tipos
de objetos, cada uno de los cuales define mtodos o campos iguales Supongamos dos tipos de objetos pertenecientes a las clases Grficos y Sonidos,y se
crea un nuevo objeto denominado Multimedia a partir de ellos Grficos
tiene tres campos datos: tamao, color y mapasdebits, y los mtodos
dibujar,cargar,almacenar y escala;sonidos tiene dos campos datos,
duracin, voz y tono, y los mtodos reproducir, cargar, escala y
almacenar As, para un objeto Multimedia,el mtodo escala significa poner
el sonido en diferentes tonalidades, o bien aumentar/reducir el tamao de la
escala del grfico
Naturalmente, el problema que se produce es la ambigedad, y se tendr
que resolver con una operacin de prioridad que el correspondiente lenguaje
deber soportar y entender en cada caso
En realidad, ni la herencia simple ni la herencia mltiple son perfectas en
todos los casos, y ambas pueden requerir un poco ms de cdigo extra que
represente bien las diferencias en el modo de trabajo

Observe que no le indicamos a la ventana cmo cambiar su tamao, la


ventana maneja la operacin por s misma De hecho, se puede enviar el mismo
mensaje a diferentes clases de ventanas y esperar a que cada una realice la
misma accin
Los mensajes pueden venir de otros objetos o desde fuentes externas, tales
como un ratn o un teclado

Figura 3 , 1 7 Mensajes entre objetos,

Una aplicacin Windows es un buen ejemplo de cmo se emplean los mensajes para comunicarse entre objetos El usuario pulsa un botn para enviar
(remitir, despachar) mensajes a otros objetos que realizan una funcin especfica Si se pulsa el botn Exit,se enva un mensaje al objeto responsable de
cerrar la aplicacin Si el mensaje es vlido, se invoca el mtodo interno Entouces se cierra la aplicacin,

90

Programacin orientada a objetos

91

Conceptos fundamentales de programacin orientada a objetos

3.6,,1.. Activacin de objetos

Infor mncin especial necesaria para realizar el mtodo invocado (argumentos o parmetros requeridos)

A los objetos slo se puede acceder a travs de su interfaz pblico Cmo se


permite el acceso a un objeto? Un objeto accede a otro objeto envindole un
mensaje

sumar

10 X y Z "
--

receptor mtodo parmetro


Carro
Modelo

Puenas

Edad
PreCiLcBl'o

Figura 3 20

Calcular precio ( )
l

Figura 3,,18 Envio de un mensaje,,

3,,6,,2. Mensajes
Un mensaje es una peticin de un objeto a otro objeto al que le solicita ejecutar
uno de sus mtodos Por convenio, el objeto que enva la peticin se denomina
emisor y el objeto que recibe la peticin se denomina receptor,

- .I[_->
Prueba ( )

C ~ b j e t emisor
o

lJ--

Objeto receptor

Estructura de un mensaje

Cuando un objeto est inactivo (durmiendo) y recibe un mensaje se hace


activo El mensaje enviado por otros objetos o fuentes tiene asociado un mtodo que se activar cuando el receptor recibe dicho mensaje La peticin no
especifica cmo se realiza la operacin Tal informacin se oculta siempre al
emisor
El conjunto de mensajes a los que responde un objeto se denomina comportamiento del objeto No todos los mensajes de un objeto responden; es preciso
que pertenezcan al interfaz accesible,
Nombre de un mensaje

Un mensaje incluye el nombre de una operacin y cualquier argumento requerido por esa operacin Con frecuencia, es til referirse a una operacin por
nombre, sin considerar sus argumentos
Mtodos

Calcular-precio (100)
Producto

Figura 3 19

Objetos emisor y receptor de un mensaje

Estructuralmente, un mensaje consta de tres partes:


Identidad del receptor
El mtodo que se ha de ejecutar

Cuando un objeto recibe un mensaje, se realiza la operacin solicitada ejecutando un mtodo Un nztodo es el algoritmo ejecutado en respuesta a la
recepcin de un mensaje cuyo nombre se corresponde con el nombre del
mtodo
La secuencia actual de acontecimientos es que el emisor enva su mensaje; el
receptor ejecuta el mtodo apropiado, consumiendo los par&metros; a continuacin, el receptor devuelve algn tipo de respuesta al emisor para reconocer
el mensaje y devolver cualquier informacin que se haya solicitado
-- .
. ..
El receptor responde a un mens;ijc...
- .
-

.... .

..
- .........

..
... -. . .... - - - - . .

Conceptos fundamentales de programacin orientada a objetos

92

93

Programacin onentada a objetos

3.6.3.

Abrit"-Il

Paso de mensajes

L.os objetos se comunican entre s a travs del uso de mensajes El interfaz del
mensaje se define un interfaz claro entte el objeto y el resto de su entorno
Esencialmente, el protocolo de un mensaje implica dos partes: el emisor y el
receptor Cuando un objeto emisor enva un mensaje a un objeto receptor, tiene
que especificar lo siguiente:

1
2
3

Mtodos

~~~~~

Objetos

Objetos en notacin YourdonICoad

3.7.1. Atributos
par6rnetroN)>

Ejemplo
enviar Coche1 P r e c i o C o c h e O
enva a Coche1 el mensaje Precio-Coche
enviar Cochel Fijarqrecio (8-10-92) enva a Cochel el mensaje Fijar-precio
con el parametro 8- 10-92
enviarcoche1 Poner-en-blanco0
enva a Coche1 el mensaje Poner-en-blanco

ESTRUCTURA INTERNA DE U N OBJETO

La estructura interna de un objeto consta de dos componentes bsicos:


Atributos
Mtodos (operaciones o servicios)

Atributos Servicios -

Figura 3 22

El ejemplo siguiente muestra algunos mensajes que se pueden enviar al


objeto Cochel El primero de stos invoca al mtodo Precio-Coche y no
tiene argumentos, mientras que el segundo, F i j a r q r e c i o , enva los parmetros 8-10-92, y p o n e r - e n b l a n c o no tiene argumentos

.. . .....

Alimento

La estructura de un mensaje puede ser:

3.7.

~~...

~~~~

Figura 3 2 1 Notacin grfica OMT de una clase y de u n objeto

Datos utilizados por el mtodo invocado


Un mensaje, propiamente dicho

(parmetrol,

~~.~
. ..

Clase

Un receptor
Un nombre de mensaje
Argumentos o parmetros (si se necesita)

enviar <Objeto A> <Mtodo1

~~~

. .....

En primer l u g a ~ ,un objeto receptor que ha de recibir el mensaje que se


ha especificado Los objetos no especificados por el emisor no respondern El
receptor trata de concordar el nombre del mensaje con los mensajes que
l entiende Si el mensaje no se entiende, el objeto receptor no se activar Si el
mensaje se entiende por el objeto receptor, el receptor aceptar y responder
al mensaje invocando el mtodo asociado
Los parmetros o argumentos pueden ser:

.....

Los atributos describen el estado del objeto Un atributo consta de dos partes:
un nombre de atributo y un valor de atributo
Los objetos simples pueden constar de tipos primitivos, tales como enteros,
carcter, boolean, reales, o tipos simples definidos por el usuario Los objetos
complejos pueden constar de pilas, conjuntos, listas, array, etc, o incluso estructuras recursivas de alguno o todos los elementos
Los constructores se utilizan para construir estos objetos complejos a partir
de otros objetos complejos

3.7.2.

Mtodos

Los mtodos (operaciones o servicios) describen el coinportamiento asociado a


un objeto Representan las acciones que pueden realizarse por un objeto o
sobre un objeto La ejecucin de un mtodo puede conducir a cambiar el
estado del objeto o dato local del objeto
Cada mtodo tiene un nombre y un cuerpo que realiza la accin o comportamiento asociado con el nombre del mtodo En un LOO, el cuerpo de un
mtodo consta de un bloque de cdigo procedimental que ejecuta la accin
requerida Todos los mtodos que alteran o acceden a los datos de un objeto se
definen dentro del objeto Un objeto puede modificar directamente o acceder a
los datos de otros objetos

94

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

Un mtodo dentro de un objeto se activa por un mensaje que se enva por


otro objeto al objeto que contiene el mtodo De modo alternativo, se puede
llamar por otro mtodo en el mismo objeto por un mensaje local enviado de un
mtodo a otro dentro del objeto

m
Objeto A

El mtodo-1 llama
al mtodo-2,
envindole
I

El mtodo-3

se invoca por
un mensaje
de otro objeto

Figura 3 2 3 Invocacin de u n mtodo,


metodo: Precio-coche
fin

3..8.CLASES
La clase es la construccin del lenguaje utilizada ms frecuentemente para
definir los tipos abstractos de datos en lenguajes de programacin orientados a
objetos Una de las primeras veces que se utiliz el concepto de clase fue en
Simula (Dahl y Nygaard, 1966; Dahl, Myhrhang y Nigaard, 1970) como entidad que declara conjuntos de objetos similares En Simula, las clases se utilizaron principalmente como plantillas para crear objetos de la misma estructura,
Los atributos de un objeto pueden ser tipos base, tales como enteros, reales y
booleans; o bien pueden ser arrays, procedimientos o instancias de otras clases
Generalmente, una clase se puede definir como una descripcin abstracta de
un grupo de objetos, cada uno de los cuales se diferencia por un estado especfico y es capaz de realizar una serie de operaciones
Por ejemplo, una pluma estilogrfica es un objeto que tiene un estado (llena
de tinta o vaca) que puede realizar algunas operaciones (por ejemplo escribir,
poner/quitar el capuchn, rellenar si est vacla)
En programacin, una clase es una estructura que contiene datos y procedimientos (o funciones) que son capaces de operar sobre esos datos Una clase
pluma estilogrfica puede tener, por ejemplo, una variable que indica si est llena
o vaca; otra variable puede contener la cantidad de tinta cargada realmente La
clase contendr algunas funciones que operan o utilizan esas variables
Dentro de un programa, las clases tienen dos propsitos principales: definir
abstracciones y favorecer la modularidad

95

Cul es la diferencia entre una clase y un objeto, con independencia de su


complejidad? Una clase verdaderamente describe una familia de elementos similares En realidad, una clase es una plantilla para un tipo particular de
objetos Si se tienen muchos objetos del mismo tipo, slo se tienen que definir
las caractersticas generales de ese tipo una vez, en lugar de en cada objeto
A paitir de una clase se puede definir un nmero de objetos Cada uno de
estos objetos tendr generalmente un estado peculiar propio (una pluma puede
estar rellenada, otra puede estar medio-vaca y otra estar totalmente vaca) y
otras caractersticas (como su color), aunque compartirn operaciones comunes
(como <<escribir,llenar, poner el capuchn, etc)
En resumen, un objeto es una instancia de una clase

3..8.1. Una comparacin con tablas de datos


Una clase se puede considerar como la extensin de un registro Aquellas
personas familiarizadas con sistemas de bases de datos pueden asociar clase e
instancias con tablas y registros, respectivamente Al igual que una clase, una
tabla define los nombres y los tipos de datos de la inforinacin que contenga
Del mismo modo que una instancia, un registro de esa tabla proporciona los
valores especficos para una entrada particular La principal diferencia, a nivel
conceptual, es que las clases contienen mtodos, adems de las definiciones de
datos,
Una clase es una caja negra o mdulo en la que est permitido conocer lo
que hace la clase, pero no cmo lo hace Una clase ser un indulo y un tipo
Como mdulo la clase encapsula los recursos que ofrece a otras clases (sus
clientes) Como tipo describe un conjunto de objetor o instancias que existen en
tiempo de ejecucin

Instancia (objeto)
de la clase
Figura 3.,24 Una clase y una instancia (objeto) de la clase (Notacin Booch),
Clase

Instancias corno registros


Servicio

Horas

Frecuencia I>eicucnro

96

Conceptos fundamentales de programac~norientada a objetos

Programacin orientada a objetos

ramente un soporte poderoso para reutilizacin y extensibilidad, dado que la


definicin de nuevos objetos se pueden basar en clases existentes
Como ejemplo, considrese la jerarqua de herencia mostrada en la Figura 1 2 6

(Cuenta Ahorro)

Clase

97

Instancia

Figura 3.25, Instancias de una clase (notacin OMT),

Los objetos ocupan espacio en memoria, y en consecuencia existen en el


tiempo, y debern crearse o instanciarse (probablemente a partir de otros objetos) Por la misma razn, se debe liberar el espacio en memoria ocupado por los
objetos Dos operaciones comunes tpicas en cualquier clase son:
Constructor: una operacin que crea un objeto y/o inicializa su estado
Destructor: una operacin que libera el estado de un objeto y10 destruye
el propio objeto
En C + + los constructores y dest~ucto~es
se declaran como parte de la
definicin de una clase La creacin se suele hacer a travs de operaciones
especiales (constructores en C + + , p i l a ) ; estas operaciones se aplicarn implcitamente o se debern llamar explcitamente por otros objetos, como sucede
en C + +
Cuando se desea crear una nueva instancia de una clase, se llama a un
mtodo de la propia clase para realizar el proceso de construccin Los mtodos constructores se definen como mtodos de la clase De modo similar, los
mtodos empleados para destruir objetos y liberar la memoria ocupada (destructores en C + + , - p i l a ) tambin se definen dentro de la clase

-- - .-.-

-. .

---

- - .-

-7

Un objeto es una ~n.sruiiciu(ejemplar, caso u ocurrencia) de una clase.


--

3..9.HERENCIA Y TIPOS
Los objetos con propiedades comunes (atributos y operaciones) se clasifican en
una clase De igual modo, las clases con propiedades y funciones comunes se
agrupan en una superclase Las clases que se derivan de una superclase son las
subclases.

Las clases se organizan como jerarquia de clases La ventaja de definir clases


en una jerarqua es que a travs de un mecanismo denominado herencia, casos
especiales comparten todas las caractersticas de sus casos ms generales
La herencia es una caracterstica por la que es posible definir una clase, no
de un borrador, sino en trminos de otra clase Una clase hereda sus caractersticas (datos y funciones) de otra clase Esta caracterstica proporciona cla-

Figura 3 2 6

Jerarqua de herencia

Las clases de objeto mamifero, pjaro e insecto se definen como subclases de


animal; la clase de objeto persona, como una subclase de mamifero, y un hombre y una mujer son subclases de persona
Las definiciones de clases para esta jera~quapuede tomar la siguiente estr nctura:
clase criatura
atributos
tipo : ctring;
peco : real;
algun tipo de habitat
1
habitat : 1
operaciones
crear ( ) +criatura;
predadorescriatura) -fijarlcriatural;
esperanza-vidacriatura) -entero;
end criatura
clase mamifero inherit criatura;
atributos (propiedades)
periodo-gestacion: real;
ogeraciones
end mamifero
clase persona inherit mamifero,
propiedades

Conceptos fundamentales de programacin orientada a objetos

98

Programaoon orientada a objetos

apellidos, nombre: string;


fechanacimiento: date;
origen: pais;
end persona

99

En la Figura 3 28 la clase C tiene dos superclases, A y D Por consiguiente,


la clase C hereda las propiedades de las clases A y D Evidentemente, esta
accin puede producir un conflicto de nombres, donde la clase C hereda las
mismas propiedades de A y D

clase hombre inherit persona;


atributos
esposa: mujer;
operaciones
end hombre

clase mujer inherit persona;


propiedades
esposo: man;
nombre: ctring;
end mujer

La herencia es un mecanismo potente para tratar con la evolucin natural


de un sistema y con modificacin incremental [Meyer, 19881 Existen dos tipos
diferentes de herencia: simple y mltiple,

Figura 3 2 8 , Herencia mltiple


Herencia selectiva

La herencia selectiva es la herencia en que algunas propiedades de las superclases se heredan selectivamente por parte de la clase heredada Por ejemplo, la
clase B puede heredar algunas propiedades de la superclase A, mient~asque
la clase C puede hetedar selectivamente algunas propiedades de la superclase A
y algunas de la superclase D
Herencia mltiple

3.9.1.

Herencia simple (herencia jerrquica)

En esta jerarqua cada clase tiene como mximo una sola supeiclase. La herencia simple permite que una clase herede las propiedades de su superclase en una
cadena jerrquica

Problemas
1

La propiedad referida solo est en una de las subclases padre

2 La propiedad concreta existe en ms de una superclase


Caso 1

No hay problemas

Atributos
Nombre
Direccin
Campus
Curso
Ao

Figura 3 2 7 Herencia simple,,

Atributos heredados
Nombre
Das-Vacaciones
Direccin
Curso
Salario
Campus
Estudios
Ao

3..9.2.. Herencia mltiple (herencia en malla)


Una malla o retcula consta de clases, cada una de las cuales puede tener uno O
ms superclases inmediatas Una herencia mltiple es aquella en la que cada
clase puede heredar mtodos y variables de cualquier nmero de superclase

Atributos
Nombre
Direccin
Estudios
Salario
Das-Vacaciones
Mtodo
Aumento Salario
~ t o d oheredados
s
Aumento-Salario

Figura 3.,29 Herencia de atributos y mtodos


Caro 2

Existen diferentes tipos de conflictos que pueden ocurrir:

Conflictos de nombres

100

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

Conflictos de valores
Conflictos por defecto
Conflictos de dominio
Conflictos de restricciones

101

Una clase abstracta es COCHE-TRANSPORTE-PASAJEROS Una subclase


es SEAT, que puede tener instancias directamente, por ejemplo Coche1 y
Coche2

Por ejemplo,
Conflicto de nombres

Nombre

Nombre-estudiante

Valores

Atributos con igual nombre, tienen


valores en cada clase

Una clase abstracta puede ser una impresora

Universidad con diversos campus

Reglas de resolucin de conflictos

1 Una lista de precedencia de clases, como sucede en LOOPS y FLAVORS


2 Una precedencia especificada por el usuario para herencia, como en

+ inyectores
lmpresora
matricial

Smalltalk
3

Lista de precedencia del usuario, y si no sucede as, la lista de precedencia de las clases por profundidad

Figura 3 30

Clase derivada por herencia rnultiple

Figura 3.31. La clase abstracta impresora,


Las clases derivadas de una clase base se conocen como clases concretas,
que ya pueden instanciarse (es decir, pueden tener instancias)

Como se ha comentado anteriormente, los atributos y mtodos definidos en la


superclase se heredan por las subclases Sin embargo, si la propiedad se define nuevamente en la subclase, aunque se haya definido anteriormente a nivel
de superclase; entonces la definicin realizada en la subclase es la utilizada en
esa subclase Entonces se dice que anulan las correspondientes propiedades de
la superclase Esta propiedad se denomina anulacin o sustitucin (overriding)

3..9.3..
Clases abstractas
Con frecuencia, cuando se disea un modelo orientado a objetos es til introducir clases a cierto nivel que pueden no existir en la realidad pero que son construcciones conceptuales tiles Estas clases se conocen como clases abstractas
Una clase abstracta normalmente ocupa una posicin adecuada en la jerarqua de clases que le pe~miteactuar como un depsito de mtodos y atributos
compartidos para las subclases de nivel inmediatamente inferior
Las clases abstractas no tienen instancias directamente Se utilizan para
agrupar otras clases y capturar informacin que es comn al grupo Sin embargo, las subclases de clases abstractas que corresponden a objetos del mundo
real pueden tener instancias

Figura 3 3 2 Anulacin de atributos y mtodos en clases derivadas

102

Programacin orientada a objetos

Conceptos fundamentales de programacin orientada a objetos

Supongamos que ciertos atributos y mtodos definidos en la clase A se


redefinen en la clase C Las clases E, F, G y H heredan estos atributos y
mtodos La cuestin que se produce es si estas clases heredan las definiciones
dadas en la clase A o las dadas en la clase C El convenio adoptado es que una
vez que un atributo o mtodo se tedefine en un nivel de clases especfico,
entonces cualquier hijo de esa clase, o sus hijos en cualquier profundidad,
utilizan este mtodo o atributo redefinido Por consiguiente, las clases E, F, G
y H utilizarn la redefinicin dada en la clase C, en lugar de la definicin dada
en la clase A

3.,11. SOBRECARGA
La sobrecarga es una propiedad que describe una caiacterstica adecuada que
utiliza el mismo nombre de operacin para representar operaciones similares
que se comportan de modo diferente cuando se aplican a clases diferentes Por
consiguiente, los nombres de las operaciones se pueden sobrecargar, esto es, las
operaciones se definen en clases diferentes y pueden tener nombres idnticos,
aunque su cdigo programa puede diferir
Si los nombres de una operacin se utilizan para nuevas definiciones en
clases de una jerarqua, la operacin a nivel inferior se dice que anula la operacin a un nivel ms alto
Un ejemplo se muestra en la Figura 3 33, en la que la operacin Incrementar est sobrecargada en la clase Empleado y la subclase Administrativo Dado que Administrativo es una subclase de Empleado, la operacin incrementar, definida en el nivel Administrativo, anula la operacin
correspondiente al nivel Empleado En Ingeniero la opetacin incrementar se hereda de Empleado Por otra parte, la sobrecarga puede estar situada
entre dos clases que no estn relacionadas jerrquicamente Por ejemplo, Clculo-Comisin est sobrecargada en Administrativo y en
Ingeniero Cuando un mensaje calcular-Comisin se enva al objeto
ingeniero,la operacin correspondiente asociada con ingeniero se activa,

><

103

Actualmente la sobrecarga se aplica slo a operaciones Aunque es posible extender la propiedad a atributos y relaciones especficas del modelo
propuesto
La sobrecaiga no es una propiedad especfica de los lenguajes orientados a
objetos Lenguajes tales como C y Pascal soportan operaciones sobrecargadas
Algunos ejemplos son los operadores aritmticos, operaciones de E/S y operadores de asignacin de valores
En la mayora de los lenguajes, los operadoies aritmticos +, y <e
se utilizan para sumar, restar o multiplicar nmeros enteros o reales Estos
operadores funcionan incluso aunque las implementaciones de aritmtica entera y real (coma flotante) sean bastante diferentes. El compilador genera cdigo
objeto para invocas la implementacin apiopiada basada en la clase (entero o
coma flotante) de los operandos.
As, por ejemplo, las operaciones de E/S (Entrada/Salida) se utilizan con
frecuencia para leer nmeros enteros, caiacteres o reales En Pascal readix)
se puede utilizar, siendo x un entero, un carcter o un real Naturalmente, el
cdigo mquina real ejecutado para leer una cadena de caracteres es muy
diferente del cdigo mquina para leer enteros readix) es una operacin
sobrecargada que soporta tipos diferentes Otros operadores tales como
los de asignacin (:= en Pascal o = en C) son sobrecargados Los
mismos operadoies de asignacin se utilizan para variables de diferentes
tipos
Los lenguajes de programacin convencionales soportan sobrecarga para
algunas de las operaciones sobre algunos tipos de datos, como enteros, reales y
caracteres Los sistemas orientados a objetos dan uiz poco ms en la sobrecarga
y la lzacen disponible para operaciones sobre cualquier tipo objeto,
Por ejemplo, en las operaciones binasias se pueden sobrecarga1 para nmeros complejos, arrays, conjuntos o listas que se hayan definido como tipos
estructurados o clases As, el operador binario <<+
n se puede utilizar pala
sumar las correspondieiites partes reales e imaginarias de los nmeros complejos Si ~l y A2 son dos array de enteros, se pueden definir:

Nombre

Empleado

para sumar:
= a

naci;n

Ingeniero
Beneficios
Calcular_Comisin = 0,05 * Presupuesto
Salario [40-801
Edad [25-651
Incrementar
CalcularComisin = 0.03 * Presupuesto

Figura 3 3 3 Sobrecarga,

A[i]

:=

Al[il + A2[il

//para todo i

De modo similar, si si y s2 son dos conjuntos de objetos, se puede definir:

como unin de dos conjuntos SI y s2


j,Cino se asocia una operacin particulai o mensaje a un mtodo? La
respuesta es mediante la ligadura dinmica (dyizainic birzding),que se ver posteriormente

104

Programacin orientada a objetos

Conceptos fundamentales de programaoon orlentada a objetos

3..12.. LIGADURA DlNAMlCA


Los lenguajes 00 tienen la caracterstica de poder ejecutar ligadura tarda
(dinmica), al contrario que los lenguajes imperativos, que emplean ligadura
temprana (esttica) Por consiguiente, los tipos de variables, expresiones y funciones se conocen en tiempo de compilacin para estos lenguajes imperativos
Esto permite el enlazar entre llamadas a procedimientos y los procedimientos
utilizados que se establecen cuando se cumple el cdigo En un sistema 00 esto
requera el enlace entre mensajes y que los mtodos se establezcan en tiempo
dinmico
En el caso de ligadura dinmica o tarda, el tipo se conecta directamente al
objeto Por consiguiente, el enlace entre el mensaje y el mtodo asociado slo se
puede conocer en tiempo de ejecucin.
La ligadura esttica permite un tiempo de ejecucin ms rpido que la
ligadura dinmica, que necesita resolver estos enlaces en tiempo de ejecucin
Sin embargo, en ligadura esttica se ha de especificar en tiempo de compilacin
las operaciones exactas a que responder una invocacin del mtodo o funcin
especfica, as como conocer sus tipos
el contrario, en la ligadura dinmica simplemente se especifica un mtodo en un mensaje, y las operaciones reales que realizan este mtodo se determinan en tiempo de ejecucin Esto permite definir funciones o mtodos virtuales

3.12..1. Funciones o mtodos virtuales


Las funciones virtuales en C + + permiten especificar un mtodo como virtual
en la definicin de una clase particular La implementacin real del mtodo se
-.

Mtodo virtual

105

realiza en las subclases En este caso, por consiguiente, la seleccin del mtodo
se hace en tiempo de compilacin, pero el cdigo real del mtodo utilizado se
determina utilizando ligadura dinmica o tarda en tiempo de compilacin
Esto permite definir el mtodo de un nmero de formas diferentes para cada
una de las diferentes clases Consideremos la jerarqua de clases definida en la
Figura 3 34,
Aqu el mtodo virtual se define en la clase FIGURA y el cdigo procedimeutal real utilizado se define en cada una de las subclases CIRCULO, CUADRADO,
RECTANGULO y LINEA Ahora, si un mensaje se enva a una clase especfica, se
ejecuta el cdigo asociado con ella Esto contrasta con un enfoque ms convencional que requiere definir los procedimientos por defecto, con nombres diferentes, tales como Dibujar-crculo, Dibujar-cuadrado, etc Tambin se
requerir utilizar una llamada al nombre de la funcin especfica cuando sea
necesario

3..12.2.. Polimorfismo
La capacidad de utilizar funciones virtuales y ejecutar sobrecarga conduce a
una caracterstica importante de los sistemas 00,conocida como polinzorfismo,
que esencialmente permite desarrollar sistemas en los que objetos diferentes
puedan responder de modo diferente al mismo mensaje
En el caso de un mtodo virtual se puede tener especializacin incremental
de, o adicin incremental a, un mtodo definido anteriormente en lajerarqua
Ms adelante volveremos a tratar este concepto,

3..13. OBJETOS COMPUESTOS


Una de las caractersticas que hacen a los objetos ser muy potentes es que
pueden contener otros objetos Los objetos que contienen otros objetos se
conocen como objetos conzpuestor
En la mayora de los sistemas, los objetos compuestos no contienen en el
sentido estricto otros objetos, sino que contienen variables que se iefiexen a
otros objetos La referencia almacenada en la variable se llama identificador del
objeto (ID del objeto),
Esta caracteistica ofrece dos ventajas importantes:
1

Cdigo para
dibujar un circulo

Figura 3 34

2
Mtodos o funciones virtuales

Los objetos contenidos pueden cambiar en tamao y composicin,


sin afectar al objeto compuesto que los contiene Esto hace que el mantenimiento de sistemas complejos de objetos anidados sea ms sencillo,
que sera el caso contrario,,
Los objetos contenidos estn libres para participar en cualquier nmero
de objetos compuestos, en lugar de estar bloqueado en un nico objeto
compuesto

106

Conceptos fundamentales d e programacin orientada a objetos


Programacin orientada a objetos

107

Coche
tiene-un

c5
Motor

Figura 3.,37 Relacin de agregacin (tiene-un)

3..13..1. Un ejemplo de objetos compuestos


L.a ilustracin siguiente muestra dos objetos que representa rdenes de compra
Sus variables contienen informacin sobre clientes, artculos comprados y otros
datos En lugar de introducir toda la infoimacin di~ectamenteen los objetos
o r d e n - c o m p r a , se almacenan referencia a estos objetos componentes en el
forinato del identificador de objeto (IDO),
Notacin TAYLOR
Figura 3 35

Objetos
compuestos

Un objeto compuesto

orden-compra

Un objeto coinpuesto consta de una colecciii de dos o ms objetos componentes Los objetos componentes tienen una relacin patt-of (parte-de) o component-of (coinpoizeizte-de) con objeto compuesto. Cuando un objeto compuesto
se instancia para producir una instancia del objeto, todos sus objetos componentes se deben instanciar al mismo tiempo Cada objeto coiilponente puede
se1 a su vez un objeto compuesto"

'

parte-de
Motor

Sistema frenos
Figura 3 3 6

parte_de
Sistema
transmisin

Relacin de agregacin (parte-de)

La relacin palte-de puede representarse tambin por has-a (tieize-UII),que


indica la relaciri que une al objeto agregado o co~ztiize~zte
En el caso del objeto
compuesto COCHE se leer: COCHE tiene-un MOTOR, lieize-un SISTEMA-DEFRENOS, etC
TAYLOR,
Davld Ol>jcir-Oiialred Infoiiiiatioi, Syrrciii Wiley, 1992

Articulo
Cliente
Artculo
Figura 3 38 Objetos compuestos (dos objetos orden-compra7)

Chasis

3.13.2.

Niveles de profundidad

Los objetos contenidos en objetos compuestos pueden, por s mismos, ser objetos compuestos, y este anidamiento puede ir hasta cualquier profundidad Esto

'

Este ejemplo esta citada en: TAYLOK,


David: up cir pg 45 Asimismo, la notacidn de objetos
empleada por Taylor se ha mantenido en varios ejeinplos de nuestra obra, ya que la consideramos
una de las ms idneas para reflejar el concepto de objeto; esta obra y otras suyas sobie el tema son
consideradas como aportaciones muy notables al mundo cientfico de los objetos

108

Programacin orientada a objetos

Conceptos fundamentales de programacion orientada a objetos

significa que puede construir estructuras de cualquier complejidad conectando


objetos juntos Esto es importante debido a que normalmente se necesita ms
de un nivel de modulariracin para evitar el caos en sistemas a gran escala,
Un objeto compuesto, en general, consta de una coleccin de dos o ms
objetos relacionados conocidos como objetos componentes Los objetos componentes tienen una relacin una parte-de o un componente-de con objeto compuesto Cuando un objeto compuesto se instancia para producir un objeto
instancia, todos sus objetos componentes se deben instanciar al mismo tiempo
Cada objeto componente puede, a su vez, ser un objeto compuesto, resultando,
por consiguiente, una jerarqua de componentes-de
Un ejemplo de un objeto compuesto es la clase COCHE Un coche consta de
diversas partes, tales como un motor, un sistema de frenos, un sistema de
transmisin y un chasis; se puede considerar como un objeto compuesto que
consta de partes diferentes: MOTOR, SISTEMA-FRENOS, SISTEMA-TRANSMISION,CHASIS Estas partes constituyen los objetos componentes del objeto
COCHE,de modo que cada uno de estos objetos componentes pueden tener
atributos y mtodos que los caracterizan

109

La jerarqua componente-de ( p u fte-de) pueden estar solapadas o anidadas


Una jerarqua de solapamiento consta de objetos que son componentes de ms
de un objeto padre
Una jerarqua anidada consta de objetos que son componentes de un objeto
padre que, a su vez, puede actuar como componente de otro objeto. El objeto Z
es un componente del objeto B, y el objeto B es un componente de un objeto
complejo ms grande, A

COCHE

atribvtos

Nmero_coches-vendidos
atributos compartidos
C o n c e s i o n a r i o : SEAT

Andaluca

Figura 3 3 9 . Jerarquia de componentes agregados

atributos instancia

Modelo
Color
Precio

componentes

MOTOR
SISTEMA-FRENOS
SISTEMP-TRANSMISION
CHASIS

MOTOR

Figura 3 4 0

Atributos:
Nmero-cilindras
Potencia
Cilindrada
Vlvulas-cilindro

Tipo:
ABS:

Proveedor:

Un ejemplo tpico de un objeto compuesto anidado es un archivador Un


archivador contiene cajones, un cajn contiene carpetas y una carpeta contiene
documentos El ejemplo COCHE, citado anteriormente, es tambikn un objeto
compuesto anidado

3.14.
Atributos:
Tipo:
Color:

Anidamiento de objetos,

REUTlLlZAClON CON ORlENTAClON A OBJETOS

Reutilizacin o reutzlizabilidad es la propiedad por la que el software desarrollado puede ser utilizado cuantas veces sea necesario en ms de un programa As
por ejemplo, si se necesita una funcin que calcule el cuadrado o el cubo de un

110

Conceptos fundamentales de programacin orientada a objetos

Programacin orientada a objetos

nmero, se puede crear la funcin que realice la taiea que el programa necesita,
Con un esfuerzo suplementario se puede crear una funcin que pueda elevar
cualquier nmero a cualquier potencia Esta funcin se debe guardar para
poderla utilizar como herramienta de propsito general en cuantas ocasiones
sea necesario
Las ventajas de la reutilizacin son evidentes El ahorro de tiempo es, sin
duda, una de las ventajas ms considerables, y otra la facilidad para intercambiar software desarrollado por diferentes programadores
En la programacin tradicional, las bibliotecas de funciones (casos de
FORTRAN o C) evitan tener que ser escritas cada vez que se necesita su uso
Ada y Modula-2 incorporan el tipo de dato paquete (package) y mdulo
(module) que consta de definicin de tipos y cdigos y que son la base de la
reutilizaciii de esos lenguajes

terstica El smbolo +, cuando se utiliza con enteros, representa un conjunto


de instrucciones mquina distinto de cuando los operadores son valores reales
de doble precisin De igual modo, en algunos lenguajes el smbolo + sirve
para realizar sumas aritmticas o bien para concatenar (unir) cadenas,
La utilizacin de operadores o funciones de formas diversas, dependiendo
de cmo se estn operando, se denomina poliilzo~fisilzo(mltiples formas)
Cuando un operador existente en el lenguaje tal como +, = o x; se le asigna
la posibilidad de operar sobre un nuevo tipo de dato, se dice que est sob~ecargado La sobiecaiga es una clase de polimorfismo, que tambin es una caracteistica importante de P O 0 Un uso tpico de los operadores aritmticos es la
sobrecarga de los mismos para actuar sobre tipos de datos definidos por el
usuario (objetos), adems de sobre los tipos de datos predefinidos Supongamos
que se tienen tipos de datos que iepresentan las posiciones de puntos en la
pantalla de un computador (coordenadas x e y) En un lenguaje orientado a
objetos se puede realizar la operacin aritmtica

3.14.1. Objetos y reutilizacin


posicin1 = origen

La progtamaciii orientada a objetos pioporciona el marco idneo para la


reutilizacin de las clases Los conceptos de encapsulamiento y herencia son las
bases que facilitan la reutilizacin Un programador puede utilizar una clase
existente, y sin modificarla, aadirle nuevas caractersticas y datos Esta operacin se consigue derivando una clase a partir de la clase base existente La
nueva clase hereda las propiedades de la antigua, pero se pueden aadii nuevas
propiedades Pot ejemplo, suponga que se escribe (o compia) una clase men
que crea un sistema de mens (barias de desplazamiento, cuadros de dilogo,
botones, etc); con el tiempo, aunque la clase funciona bien, obseiva que sera
interesante que las leyendas de las opciones de los mens parpadearn o cambiarn de color Pala realiza1 esta tarea se disea una clase derivada de men
que aada las nuevas propiedades de parpadeo o cambio de color
La facilidad para reutilizar clases (y en consecuencia objetos) es una de las
propiedades fundamentales que justifican el uso de la programacin orientada
a objetos Por esta razn los sistemas y en particular los lenguajes orientados a
objetos suelen venir provistos de un conjunto (biblioteca) de clases predefinidas,
que permite ahorrar tiempo y esfuerzo en el desairo110 de cualquier aplicacin
Esta lieriamieiita -la biblioteca de clases- es uno de los parmetros fundamentales a tener en cuenta en el moineiito de evaluar un lenguaje orientado a
objetos

Otra propiedad importante de la programacin orientada a objetos es el polimoifisino Esta propiedad, en su concepcin bsica, se encuentra en casi todos
los lenguajes de programacin El polimorfismo, en su expresin ms simple, es
el uso de un nombie o un smbolo -por ejemplo un operador- para represental o significa1 ms de una accin As, en C, Pascal y FORTRAN -entre otros
lenguajes- los operadores aritmticos repiesentan un ejemplo de esta carac-

111

posicin2

donde las variables posicinl, posicin2 y o~igenrepresentan cada una posiciones de puntos, sobrecargando el operador ms (+) para realizar suma de posiciones de puntos (x, y) Adems de esta operacin de suma se podran realizar
otias operaciones, tales como iesta, multiplicacin, etc, sobrecargando coiivenientemente los operadores -, *, etc
En un sentido ms general, el polimorfismo supone que un mismo mensaje
puede producir acciones (resultados) totalmente diferentes cuando se reciben
por objetos diferentes. Con polimorfismo un usuario puede enviar un mensaje
genrico y dejar los detalles de la implementacin exacta para el objeto que
recibe el mensaje El polimorfisino se fortalece con el mecanismo de herencia
Supongamos un tipo objeto llarnado vehlculo y tipos de objetos derivados llamados bicicleta,automvil,moto y embarcacin Si se enva un
mensaje conducir al objeto vehculo,cualquier tipo que herede de vehculo
puede tambin aceptar ese mensaje Al igual que sucede en la vida real, el
mensaje conducir reaccionar de modo diferente en cada objeto, debido a que
cada vehculo iequiere una forma distinta de conducir

RESUMEN
E:l tipo abstiacto de datos se implementa a travs de clases Una clase es un
conjunto de objetos que constituyen inslancias de la clase, cada una de las
cuales tienen la misma estructura y comportamiento Una clase tiene un nonibre, una coleccin de operaciones para manipular sus instancias y una representacin. Las operaciones que manipulan las instancias de una clase se llaman
nltodos El estado o representacin de una instancia se almacena en variables
de iiistancia Estos mtodos se invocan mediante el envo de mensaje,^ a instancias El envo de mensajes a objetos (instancias) es similar a la llamada a procedimientos en lenguajes de programacin tradicionales

112

Programacin orientada a objetos

El mismo nombre de un mtodo se puede sobrecargar con diferentes implementaciones; el mtodo I m p r i m i r se puede aplicar a enteros, arrays y cadenas
de caracteres La sobrecarga de operaciones permite a los programas ser extendidos de un modo elegante La sobrecarga permite la ligadura de un mensaje a
la implementacin de cdigo del mensaje y se hace en tiempo de ejecucin Esta
caracterstica se llama ligadura dinmica.
El polimoifismo permite desarrollar sistemas en los que objetos diferentes
pueden responder de modo diferente al mismo mensaje La ligadura dinmica,
sobrecarga y la herencia permite soportar el polimorfismo en lenguajes de
programacin orientados a objetos
Los programas orientados a objetos pueden incluir objetos compuestos,
que son objetos que contienen otros objetos, anidados o integrados en ellos
mismos,
Los principales puntos clave tratados son:

CAPITULO

LENGUAJES DE PROGRAMACION
ORIENTADOS A OBJETOS

La programacin orientada a objetos incorpora estos seis componentes


importantes:
Objetos
Clases
Mtodos
Mensajes
Herencia.
Polimorfismo
Un objeto se compone de datos y funciones que operan sobre esos
objetos
La tcnica de situar datos dentro de objetos de modo que no se puede
acceder directamente a los datos se llama ocultacin de la informacin
Una clase es una descripcin de un conjunto de objetos Una instancia es
una variable de tipo objeto y un objeto es una instancia de una clase,
La herencia es la propiedad que permite a un objeto pasar sus propiedades a otro objeto, o dicho de otro modo, un objeto puede heredar de otro
objeto
Los objetos se comunican entre si pasando mensajes
La clase padre o ascendiente se denomina clase base y las clases descendientes clases derivadas
La reutilizacin de software es una de las propiedades ms importantes
que presenta la programacin orientada a objetos
El polimorfismo es la propiedad por la cual un mismo mensaje puede
actuar de diferente modo cuando acta sobre objetos diferentes ligados
por la propiedad de la herencia

CONTENIDO
4 1 Evolucin de los LPOO
4 , 2 Clasificacin de lenguajes orientados a objetos
4 , 3 Ada
4.4

Eiffel

4 5 Srnalltalk
4 6 . Otros lenguajes de programacin orientados a objetos
~

~~

RESUMEN
EJERCICIOS

Este capitulo describe:


La evolucin de los lenguajes de programacin orientados a objetos, desde Simula a Object COBOL,,
Las caractersticas de un lenguaje orientado a objetos,
La clasificacin de los lenguajes orientados a objetos basados en objetos, orientados a objetos (puros e hbridos)
basados en objetos, orientados a objetos basados en clases,
Una descripcin breve de los lenguajes ms utilizados:
Smalltalk, C++, Objective-C, Eiffel, Object Pascal, Visual
BASlC y Ada,

114

41.

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

115

EVOLUCION DE LOS LPOO

Al principio de la dcada de los sesenta, Kristen Nygaard y Ole-Johan Dhal


desarrollaron Simula en el Norwegian Computer Center (NCC), un lenguaje
que soportaba modelizacin para simulacin de procesos industriales y
cientficos Fue un lenguaje de propsito general que ofreca capacidad de
simulacin de sistemas Sin embargo, sus usuarios descubrieron pronto que
Simula proporcionaba nuevas y poderosas posibilidades parafiizes distintos de
la simulacin, como la elaboracin de prototipos y el diseo de aplicaciones.
L.as sucesivas versiones de Simula fueron mejorndose hasta llegar a Simula-67
(aparicin en diciembre de 1966) Simula-67 se derivaba de Algol 60, donde
tiene sus races, y se dise fundamentalmente como un lenguaje de programacin de diseo; tom de Algo1 el concepto de bloque e introdujo el concepto de
objeto 1.0s objetos de Simula tenan su propia existencia y podan comunicarse entre s durante un proceso de simulacin Conceptualmente, un objeto
contena tanto datos como las operaciones que manipulaban esos datos Las
operaciones se llamaron mtodos Simula incorporaba tambin la nocin de
clases, que se utilizaron para describir la estxuctura y comportamiento de un
conjunto de clases La herencia de clases fue tambin soportada por Simula La
herencia organiza las clases en jerarquas, permitiendo la compartimentacin
de implementacin y estructura. En esencia, Simula sent la base de los lenguajes orientados a objetos y defini algunos de los conceptos clave de la orientacin a objetos Adems, Simula era un lenguaje fuertemente tipificado Esto
significa que el tipo de cada variable se conoce en tieinpo de compilacin, de
modo que los errores que implican tipos se encuentran en esta etapa y no
cuando el programa se ejecuta
Simula-67 fue el piimer lenguaje de programacin que incorpor mecanismos para soportar los conceptos orientados a objetos ms sobresalientes:

Ericapsulai~zientoy objetos, que agrupan juntos atributos de datos y acciones (mtodos) que procesen esos datos
Verificaciiz e~tticade tipos, que se realiza durante el proceso de compilacin para proporcionar seguridad en tiempo de ejecucin para la manipulacin externa de los atributos de los objetos
Clases, como plantillas o patrones de objetos
Hei encia, como medio de agrupar clases con propiedades comunes
Ligadula dininica (polimoifismoj, para permitir a las clases de objetos
que tengan iriterfaces idnticos y propiedades que se puedan intercambiar
La Figura 4 1 muestra la evolucin (qenealoaia) de los lenguaies de prorra. macin oiientados a objetos (LPOO).E= esta figura se muestra yue Simula-67
(Simula). inspir el desarrollo de Smalltalk,. aue es el verdadero vrimer lenguale
de programacin orientado a objetos.
Alan Kay cre Smalltalk-80 en Xerox PARC (Xerox Palo Alto Research
Park) con Adele Goldberg, que previamente haba trabajado con una implementacin de Simula Smalltalk es un lenguaje orientado a objetos pulo, todos es
A

Java

Figura 4 1

Genealogia de los lenguajes de objetos segun Sebesta'

' Esta genealoga ha sido extrada y modificada ligeramente con lenguajes de los noventa, de:
Robert W Sebesta, Coriceptn of Progi.ai~i>ningLanguager Addison-Wesley, 2nd edil 1993

116

un objeto>>de una clase y todas las clases heredan de una nica clase base
denominada O b j e c t Smalltalk afirm el trmino mtodo para describir las
acciones realizadas por un objeto y el concepto de paso de mensajes como el
medio para activar mtodos Es tambin un lenguaje tipificado dinmicamente, que liga (enlaza) un mtodo a un mensaje en tiempo de ejecucin
Smalltalk ha sido, a su vez, el inspirador de un gran nmero de lenguajes
00 Entre ellos destaquemos Eiffel, Smalltalk-80, Smalltalk/V, C + + , Actor,
Objective-C y CLOS, as como extensiones 00 de lenguajes tradicionales, tales
como Object Pascal, Object COBOL, etc
Bertran Meyer, el diseador de Eiffel, fue tambin un usuario de Simula, e
incluso lleg a ser presidente de la Asociacin de Usuarios de Simula .Jean
Ichbiah, el diseador jefe de Ada-83, dirigi un equipo que implement un
subconjunto de Simula, y Bjarne Stroustrup, el diseador de C + + , utiliz
Simula y siempre ha agradecido su influencia en el diseo de C + +
Existen varias versiones y dialectos de Smalltalk: Smalltalk-72, -'74, -'76, -78,
-80, y ms recientemente -y seguramente la ms popular- Smalltalk/V de
Digitalk Smalltalk no es un lenguaje tipificado Smalltalk es extraordinariamente rico en conceptos orientados a objetos. En Smalltalk todo es un objeto,
incluyendo clases base y tipo base Esto significa que la potencia de Smalltalk,
como un entorno de programacin completo, se fundamenta en el envo de
mensajes a objetos
Otra caracterstica fundamental que diferencia a Smalltalk es su capacidad
de concurrencia La concurrencia es un aspecto del mundo real Por ejemplo, en
un entorno de oficina, secretarias, administrativos, gerentes y otros empleados
funcionan simultnea e independientemente Se comunican entre s, a travs de
conversaciones, informes, correo electrnico, etc Smalltalk emple la construccin denominada proceso para soportar concurrencia,
Durante la dcada de los ochenta, los conceptos orientados a objetos (tipos
abstractos de datos, herencia, identidad de objetos y concurrencia), Smalltalk,
Simula y otros lenguajes comenzaron a mezclarse y producir nuevos lenguajes
orientados a objetos, as como extensiones y dialectos El desarrollo de lenguajes
de orientacin a objetos en esa dcada se muestra en la siguiente clasificacin:
1

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos

Extenscones, dialectos y ve?siones de Smalltalk Xerox y Textronix incorporaron en sus mquinas, a principios de los ochenta, la versin Smally compatibles,
Extelzsiones orientadas a objetos de lenguajes convencionales Uno de los
lenguajes orientados a objetos ms populares es C + + Este lenguaje
fue diseado por Bjarne Stroustrup en AT&T al principio de los ochenta [Stroustrup, 19861 La primera implementacin del lenguaje C + + se
lanz como un preprocesador a los compiladores C C + + proporcion
dos construcciones para definiciones de clases El primer mtodo es una
extensin de la construccin s t r u c t (estructura de C) y la otra nueva
construccin c l a s s (clase) C + + incorpor jerarqua de clases y permita subclases que podan acceder a mtodos y variables instancias de

4.1.1.

117

otras clases de su jerarqua El lenguaje C + + permita la ligadura dinmica y el polimorfismo, as como sobrecarga de funciones y operaciones
Sin embargo, al contrario que Smalltalk, las primeras versiones de C + +
no se comercializaban en bibliotecas grandes de clases predefinidas
Otro dialecto importante de C f , con propiedades orientadas a objetos, es Objective-C [Cox, 19871 Este lenguaje es un superconjunto
de C, que incorpora caractersticas orientadas a objetos de Smalltalk
Al igual que Smalltalk, Objective-C inclua una gran coleccin de clases
predefinidas que permita simplificar el proceso de desarrollo Objective-C soportaba tipos abstractos de datos, herencia y sobrecarga de operadores Sin embargo, al contrario que C + + , no ampliaba la definicin
de construcciones existentes en lenguajes, y dise nuevas construcciones
y operadores para realizar tareas tales como definicin de clases y paso
de mensajes L.as computadoras NEXT, cuyo xito iio pas de unos aos,
eligieron Objective-C como su principal lenguaje de desarrollo
Niklaus Wirt y un grupo de ingenieros informticos de Apple Computer disearon Object Pascal [Schmucker, 19861 Extendi el lenguaje
Pascal con soporte para tipos abstractos de datos, mtodos y herencia
Incluy el concepto de tipo de objeto y definicin de clases,
Los nuevos lenguajes Ada-95 y Java son totalmente orientados a
objetos
Lenguajes orientados a objetos,fuerteine~ztetipificados Simula fue uno de
10s lenguajes orientados a objetos que se desarrollaron en la dcada
de los ochenta y que fueron implementados en diversas plataformas
Otros lenguajes han emergido en la dcada de los ochenta, con
caractersticas fuertemente tipificadas (con verificacin estricta de tipos) Un lenguaje disponible comercialinente y ms interesante es Eiffel
[Meyer, 19881 de Interactive Software Engineering, Inc Adems de
encapsulamiento y herencia, Eiffel incorpora muchas caractersticas
orientadas a objetos, tales como tipos paraiiztricos y pre y post-condicioizes para mtodos Otro lenguaje fuertemente tipificado que soporta
conceptos orientados a objetos (abstraccin, objetos, tipos paramtricos) es Ada, aunque la versin Ada-83 presenta el inconveniente de no
sopor tar hereizcia
Exteizsioizes orientadas a objetos de LISP Existen diferentes versiones
de LISP, aunque la ms conocida y notable es CL.OS (Common List
Object System) CLOS es un lenguaje 00 que introduce notables mejoras y tiene garantizada larga vida, especialmente desde la creacin del
comit X3J13 de ANSI para la estandarizacin del lenguaje

Estado actual de los lenguajes orientados a objetos


en la dcada de los noventa

La dcada de los ochenta lanz la orientacin a objetos como base de la futura


ingeniera de software orientada a objetos de la dcada de los noventa En 1982
se predijo que la piogramacin orientada a objetos sera en la dcada de los

118

Lenguajes d e programacin orientados a objetos

Programacin orientada a objetos

ochenta lo que la programacin estructurada fue en los setenta [Rentsch,


19821 La piofeca se cumpli y la dcada de los ochenta se consagr como el
origen de la explosin de la orientacin a objetos que se producira en la
dcada de los noventa
Sin duda, el desarrollo de conferencias internacionales sobre orientacin a
objetos y, en especial, OOSPLA (Object-Oriented Programming Systems and
LAnguages) han sido los detonantes de la explosin de la 00 en la dcada de
los noventa La primera conferencia se celebr en el ao 1986
Otros hitos que han influido considerablemente en el enorme desarrollo de
los LPOO han sido la aparicin de diferentes publicaciones peridicas exclusivamente dedicadas a orientacin a objetos En 1988 apareci la primera revista
de prestigio: Ihe Iournal of Object-Oriented Programming
En la dcada de los noventa, los lenguajes, tcnicas, interface5 grficos y
bases de datos se estn haciendo muy populares Sin duda, los noventa ser la
dcada de la proliferacin de tecnologas y lenguajes orientados a objetos
Microsoft, IBM, Borland, Sun, A'I&T, Digitalk, Symantec y otras grandes
compaas estn lanzando productos orientados a objetos de modo continuo y
progresivo
Los lenguajes ms implantados en la actualidad son Smalltalk y Eiffel,
junto con C + + , Object Pascal (Turbo/Borland Pascal especialmente), Visual
BASIC y Object Visual como lenguajes hbridos
C f + es, sin lugar a dudas, el lenguaje ms popular, aunque Smalltalk est
ganando adeptos da a da Tanto C + + como Smalltalk han sido implementados en diferentes plataformas: DOS, UNIX, OS/2, Windows e incluso en sistemas grandes; su importancia reside en la gran cantidad de desarrolladores y
vendedores que comercializan estos lenguajes,

4.,2..1. Taxonoma de lenguajes orientados a objetos


Una taxonoma de lenguajes de programacin con propiedades de orientacin
a objetos fue creada por Wegner2 La clasificacin incluye los siguientes grupos:

1 Basado en objetos Un lenguaje de programacin es basado en objetos


si su sintaxis y semntica soportan la creacin de objetos que tienen las
piopiedades descritas en los captulos anteriores
2 Basado en clases Si un lenguaje de programacin es basado en objetos y soporta adems la creacin de clases, se considera basado en
clases,
3 O~ientacina objetos. Un lenguaje de programacin orientado a objetos es un lenguaje basado en clases que soporta tambin herencia
Objetos

Basado en objetos

Actor
Clipper 5 X

+\

+ clases

Basado en clases

+ herencia

Clu

/ Orientado a objetos /
C++
Eiffel
Simula
Smalltalk
Turbo Borland Pascal
Delphi
Visual Object
Obiect COBOL

4..2. CLASlFlCAClON DE LENGUAJES ORIENTADOS


A OBJETOS
Como ya se ha comentado anteriormente, los lenguajes de programacin orientados a objetos son: Eiffel, Lisp, Prolog, Simula, Smalltalk, C + + , Object Pascal, etc Se entienden por lenguajes orientados a objetos aquellos que soportan
las caractersticas de orientacin a objetos Otros lenguajes de programacin,
tales como Ada, C, Cliper, pueden implemeiitar algunas caractersticas orientadas a objetos, utilizando ciertas tcnicas de programacin, pero no se consideran orientados a objetos
Los piincipales lenguajes de piogramacin utilizados actualmente pasa sistemas de tiempo real son C y Ada Ada fue diseado especficamente para la
implementacin de sistemas en tiempo real, especialmente empotrados Aunque
Ada (Ada-83) no cumple las propiedades importantes de un LPOO (por ejemplo
herencia y ligadura dinmica), soporta un enfoque de diseo orientado a objetos
y se le conoce usualmente como basado en objetos [Wegner, 871 Ada-95, ya
estandarizado por ISO y ANSI, soporta herencia y ligadura dinmica; en consecuencia, aunque todavla con restricciones, se considera orientado a objetos,

119

da-95

Figura 4 2

Taxonoma de lenguajes 00 de Wegner,

Esta taxonoma de orientacin a objetos proporciona una definicin estiicta de los lenguajes de programacin orientados a objetos, que ha prevalecido
en la poca actual Segn esta taxonoma, no es suficieiite que un lenguaje
soporte la creacin de objetos; para ser considerado orientado a objetos, es
necesario que existan construcciones de creacin de clases y que soporten herencia adecuadamente
. .~.
C + + soporta la creacin de objetos y clases, as como herencia, y es poi
consiguiente totalmente orientado a objetos. Ada-83 soporta la creacin de
objetos mediante paquetes (tipos abstractos de datos) Un paquete en Ada no

WEGNER,P : The Ohject-Oiiented Clars$calioil Poiadigrii iri Rcsearch Di>ections ilz OhjecrOiieizted Piograrnrning pgs 508-510 MIT Press, Cambiidge, MA 1987

120

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos

es una definicin de tipos como la clase C + + , y en consecuencia Ada es un


lenguaje basado en objetos Ada-95 soporta, adems de las propiedades de
Ada-83, clases y herencia, y se puede considerar orientado a objetos
De acuerdo a la taxonoma de Wegner, se podra actualizar la clasificacin
de los lenguajes pensando en la segunda dcada de los noventa:
Ada-83, Actor, Clipper 5 2, Visual Basic 4
Leizguajes basados erz objetos
Lerzguajer basados eiz clase?
Clu
Lenguajes o1,ientados a objetos C + + , Objective-C,
Object Pascal, Delphi, Visual Object,
Object COBOL,, Overon
Eiffel, Smalltalk, Simula,
Prolog++, CL.OS, Ada-95

4.,2..2. Caractersticas de los lenguajes orientados


a objetos
Adems de las caracteisticas citadas anteriormente de objetos, clases y herencia, los LPOO debern tener algunas o todas las caractersticas que se citan a
continuacin:

1 lipificacin estricta (fuerte) Iipificacidiz es el proceso de declarar el


tipo d'e informacin que puede contener una variable Los errores de
programacin ielacionados con el nmero de parmetros, tipos de
parmetros e interfaces de mdulos, se detectan durante las fases de
diseo e implementacin, en lugar de en tiempos de ejecucin
2 Encapsulamiento. Es deseable que el lenguaje soporte ocultacin de
la informacin, mediante partes independientes, para la especificacin
y la implementacin Esta caracterstica proporciona un diseo dbilmente acoplado que cumple con rigor el principio bsico de la inferencia de software: acoplamiento d6bil y fuerte cohesin entre los mdulos
de un programa
3 Compilacin incremental Caracterstica en el desarrollo de sistemas
grandes, en los que las porciones del sistema se crean e implementan
de un modo sistemtico (poco a poco, etapa a etapa) Esta caracterstica complementa la caracterstica de tipificacin estricta, que soporta partes independientes de implementacin y especfica.
4 Genericidad L,as clases parametrizadas (mediante plantillas -templates- o unidades genricas) sirven para soportar un alto grado de
reusabilidad (reutilizacin) Estos elementos genricos se disean con
parmetros brmales, que se instanciarn con parmetros reales, para
crear instancias de mdulos que se compilan y enlazan y ejecutan
posteriormente
5 Paso de mensajes.. El lenguaje es conveniente soporte paso bidimensional de mensajes entre mdulos, lo que implicar mdulos dbilmente acoplados y diseos flexibles Esto significa que se deben poder

10

121

pasar seales entre mdulos, sin necesidad de tener que pasar realmente ningn dato
Polimorfismo. L.os lenguajes deben permitir que existan operaciones
con igual nombre, que se utilicen para manejar objetos de tipos diferentes en tiempo de ejecucin El polimorfismo se implementa, normalmente, en unin con la herencia
Excepciones Se deben poder detectar, informar y manejar condiciones excepcionales utilizando construcciones del lenguaje Esta propiedad aadida al soporte de tolerancia a fallos del software permitir
una estrategia de diseo eficiente
Concurrencia Es conveniente que el lenguaje soporte la creacin de
procesos paralelos independientes del sistema operativo. Esta propiedad simplificar la transportabilidad de un sistema de tiempo real de
una plataforma a otra
Persistencia. Los objetos deben poder ser persistentes; es decir, los
objetos han de poder permanecer despus de la ejecucin del programa
Datos compartidos. Los mdulos se deben poder comunicar mediante memoria compartida, adems del paso de mensajes

Los lenguajes de programacin disponibles actualmente no cumplen todas


las caractersticas citadas anterioimente En geneial, los lenguajes orientados a
objetos no soportan concurrencia; este es el caso de C + + , aunque las versiones
de C++que siguen el futuro estndar 4 0 comienzan a incorporar propiedades
de concurrencia e incluso persistencia Asimismo, Ada-95, adems de concurrencia, soporta ya herencia y polimorfismo

4.2.3. Puros frente a hbridos


Existe un profundo debate entre los usuarios y desarrolladores de 00 sobre la
decisin del lenguaje a emplear Este debate no es reciente, aunque s es en la
actualidad cuando este debate se ha acrecentado y ha comenzado a ser decisivo
en el desarrollo de la 00
Un LPOO puro es un lenguaje diseado para soportar nicamente el paiadigma orientado a objetos, en el que todo consta de objetos, mtodos y clases
Los LPOO ms populares son Smalltalk y Eiffel Un LPOO hz'bl.ido, por otra
parte, soporta otros paradigmas de programacin (tales como el tradicional
-estructurado-,
funcional, etc), adems del paradigma orientado a objetos
Los lenguajes hbridos se constiuyen a partir de otros lenguajes existentes, tales
como C o Pascal, de los cuales se derivan; es posible utilizar el L.POO de un
modo no orientado a objetos y tambin como orientado a objetos utilizando
objetos, clases y mtodos
Cada tipo de lenguaje tiene sus ventajas e inconvenientes Los lenguajes
puros, tales como Smalltalk o Eiffel, pueden ser ms potentes, ya que utilizan
todas las ventajas de la tecnologa. Proporcionan su mxima flexibilidad para
cambiar los aspectos esenciales del lenguaje Dado que todo en el lenguaje se

122

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

123

--

Lenguajes puros

Lenguajes hibndos

Mensajes

Mensajes

+
tradicional

Figura 4.3, Lenguajes 00 purosihibridos,,


construye sobre la base de los objetos, se pueden realizar cambios profundos si
son necesarios
Existe un piecio, sin embargo, a la potencia y flexibilidad de los lenguajes
puros L.a mayora de los lenguajes puros no son tan rpidos como los hbridos
y son difciles de codificar en toda clase de operaciones fundamentales Esto les
hace perder eficiencia en tiempo de ejecucin.
En contraste, los lenguajes hbridos pierden con frecuencia alguna de las
caractersticas de los lenguajes puros y normalmente no permiten modificar
caractersticas de construccin del lenguaje base; aunque, como ya se ha comentado, son normalmente ms rpidos para operaciones construidas en el
lenguaje base
Los lenguajes puros e hbridos difieren tambin en la facilidad de aprendizaje, si bien esta facilidad depender del nivel de cada persona As, para un
programador la enseanza de un lenguaje puro normalmente es ms fcil, ya
que es ms sencillo: slo ha de aprenderse un lenguaje y no dos, como en el
caso de un lenguaje hbrido Sin embargo, para un piogramador experimentado, el movimiento o emigtacin hacia un lenguaje hbrido puede ser ms fcil si
est ya familiarizado con el lenguaje base, pues entonces s61o necesita dominar
las extensiones orientadas a objetos
En la actualidad, C + + es el lenguaje ms popular y utilizado; sin embargo,
Smalltalk est ganando da a da en aceptacin, debido esencialmente a estar
soportado por las plataformas DOS, UNIX y Windows El hecho de que en
1994 IBM lanzase versiones de Smalltalk para sus sistemas OS12 y AIX har
crecer el nmero de usuarios de este lenguaje

4..2.4.. Tipificacin esttica frente a dinmica


Iipijicacin o tipado (typing) es el proceso de declarar cul es el tipo de
informacin que puede contener una variable Poi ejemplo, una variable se
puede tipificar para contener un nico carcter, una cadena de caracteres, un
nmero entero o un nmero de coma flotante Una vez que se ha declarado el
tipo (tipificado),la variable est restringida a contener esa clase de datos Cual-

quier intento de situat otra clase de datos en la variable producir un mensaje


de errot
Algunos lenguajes de objetos requieren que a todas las variables se les
asigne un tipo antes de que se pueda utilizar Otros lenguajes no requieren esos
requisitos, petmitiendo que las variables puedan tomar sus tipos adecuados en
cualquier instante dado Estas dos opciones se denominan tipificacin fuerte,
estricta o esttica, y tipificacin dbil, no estricta o diizmica
La tipificacin fuerte o sistemas de tipos estticos exige que el progtamador asocie explcitamente un tipo con cada nombre declarado en un programa, de modo que el coinpilador del lenguaje puede verificar que los nombres
y expresiones compuestas de estos nombres se refieren siempre a los objetos
del tipo especificado El tipo de cada objeto se ha de determinar y comprobai
antes que se ejecute el programa Lenguajes con sistemas de tipos estticos
son los tradicionales FORTRAN, COBOL y PASCAL.. L.a tipificacin fuerte es
menos flexible pero ms segura, ya que el lenguaje puede realizar comprobaciones de iutinas para asegurar que los parmetros de los mensajes sean de tipo
correcto
L.as ventajas considerables de un lenguaje tipificado estticamente son que
los eirores relativos a tipos se capturan (detectan) durante la compilacin, antes
de que se ejecute el programa, y el programa se puede ejecutar ms eficientemente, dado que no hay necesidad de hacer ninguna veiificacin de tipos en
tiempo de ejecucin,
Los lenguajes con un sistema de tipos dinmicos (lenguajes de tipificacin
dbil) no exigen que el programador haya de especificar el tipo de objeto que
puedan contenei las variables cuando se escribe el programa Cada objeto
conoce su propio tipo cuando se crea durante la ejecucin Las ventajas de los
lenguajes con un sistema de tipos dinmicos son que los programas son ms
flexibles y puede disponer de nuevos tipos de objetos que no fueion previstos
cuando se escribi el programa Esta flexibilidad se hace a costa de una prdida
de eficiencia durante la ejecucin del programa, debido a la necesidad de mantener y comprobar el tipo de todos los objetos durante la ejecucin
Los lenguajes de objetos puros normalmente utilizan tipificacin dbil, ya
que este enfoque les proporciona mxima flexibilidad, especialmente durante el
desarrollo, cuando se crean nuevos tipos objetos Los lenguajes hibridos, en
contraste, tienden a construirse como lenguajes fuertemente tipificados Es posible especificar el tipo de un aigumento, de modo que haya flexibilidad en
tiempo de ejecucin, pero esta tarea requiere esfuerzos especiales

* test

definir (int ParID)

Devuelve
un puntero
al objeto test

~equiereun parmetro entero

Mtodo
definir

Figura 4 . 4 Tipificacin de u n mensaje

124

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos

cace 'P' :

funcl0;
break;
cace ' * ' : func2 O :
break;
default : cout <iCdigo desconocido:' c < car <c endl;

4.,2..5.. Ligadura esttica frente a dinmica


Ligadura es el proceso de asociar un atributo a un nombre En el caso de
funciones, el trmino ligadura (binding) se refiere a la conexin o enlace entre
una llamada a la funcin y el cdigo real ejecutado como resultado de la
llamada
La ligadura se clasifica en dos categoras: ligadura esttica y ligadura dinmica L.a ligadura esttica se conoce tambin como ligadura temprana o anticipada y se realiza en tiempo de compilacin La ligadura dinmica se conoce
tambin como ligadura retardada o porte~gaday se realiza en tiempo de ejecucin
Normalmente, los lenguajes funcionales y orientados a objetos presentan
ligadura dinmica, al contrario que los lenguajes imperativos, que suelen presentar ligadura esttica. Desde el punto de vista de la estructura del lenguaje,
los intrpretes por definicin realizan todos ligadura dinmica, mientras que los
compiladores realizan normalmente ligadura esttica
Como ejemplo de ligadura esttica, considere las declaraciones:
ConSt n = 3;
var x : integer;

el valor 3 se enlaza estticamente al nombre n, mientras que el tipo de dato


i n t e g e r se enlaza al nombre x Por otra parte, consideremos la sentencia de
asignacin x := 3; en este caso, se enlaza 3 dinmicamente a x cuando se
ejecuta la sentencia de asignacin Y la sentencia
new (y1 ;
yA

y asigna a esa

Ejemplo de ligadura esttica


Se desea procesar una determinada funcin, segn sea un determinado carcter
(cdigo) Mediante una sentencia s w i t c h se podra realizar el programa
correspondiente en C + + :

static vaid salir O


funcl O , func2 0 ;
char car;
11;
//czar, contiene el cdigo de carcter
int codigo = toupper(car1;
switch (codigo)

i
case 'S'

En este caso, la funcin invocada en respuesta a cada orden se conoce


cuando el programa se est compilando, ya que cada funcin se llama
explcitamente por el nombre
En el caso de propiedades orientadas a objetos, la ligadura se considera
como el proceso mediante el cual se determina el receptor de un mensaje En
lenguajes que requieren ligadura esttica, la identidad del receptor se debe
especificar cuando se crea el programa Si un lenguaje soporta ligadura dinmica, la identidad del receptor se puede dejar indeterminada hasta que se enva
realmente el mensaje en tiempo de ejecucin
La ligadura dinmica permite la implementacin de una de las caractersticas ms sobresalientes de la orientacin a objetos: el polimorfismo,

426.

enlaza dinmicamente una posicin de almacenamiento a


posicin el valor de y

SalirO;

125

Revisin de lenguajes orientados a objetos

Los dos lenguajes ms utilizados en el desarrollo 00 y ms introducidos en el


mercado son Eiffel, Smalltalk (en sus versiones 80 y V), C + + , Actor, ObjectiveC, CLOS, Object Pascal (especialmente 'Turbo Pascal) y Visual BASIC
El lenguaje Ada se suele considerar por muchos autores como basado erz
objetos, debido esencialmente a que soporta el concepto de abstraccin de
datos mediante el paquete y la genericidad mediante unidades genricas; tainbin es considerado basado en objetos, debido a que Grady Booch, autor del
famoso mtodo de diseo Booch, se apoy en dicho lenguaje en su primera
versin del mtodo; la metodologa HOOD tambin se apoya en Ada como
lenguaje fundamental La nueva versin Ada-95 ya es totalmente orientada a
objetos
El lenguaje Eiffel se examina brevemente, debido a que fue diseado para
soportal totalmente la orientacin a objetos y otras caractersticas de ingeniera de software El uso de precondiciones, poscondiciones e invariantes mejoran significativamente la robustez y documentacin de programas desarrollados en Eiffel
Smalltalk, como heredero directo de Simula, es el prototipo de lenguaje de
programacin orientado a objetos puro
Adems de estos lenguajes, realizaremos una sntesis de los lenguajes Objective-C, Object Pascal y Visual BASIC Por la importancia del lenguaje
C + + y dado que es el lenguaje utilizado en este libro para la implementacin
de los conceptos orientados a objetos, se dedicarn captulos especficos para
ensear la escritura y sintaxis del lenguaje, as como reglas y consejos para
mejorar el estilo de programacin y reglas y consejos para la depuracin de
progiamas

126

Programacin orientada a objetos

Lenguajes de programacin orientados a objetos

4.,3.. ADA

Un tipo abstiacto de dato paia iepresentar nmeros completos con diferenles tipos de operacines en Ada es:

Ada fue un lenguaje desarrollado a peticin de D O D (Departamento de Defensa de Estados Unidos) y como fruto de un concurso para disear un lenguaje de
programacin que sirviera para reducir el coste del desarrollo del software
Ada soporta conceptos orientados a objetos, tales como tipos abstractos de
datos, sobrecarga de funciones y operadores, polimorfismo paramtrico (geiiericidad) e iiicluso especializacin de tipos definidos poi el usuario El nico concepto que no implementa Ada es la herencia, aunque es posible emular un tipo
de herencia elemental Las propiedades orientadas a objetos se implementan de
la forma siguiente:
Encapsulamiento, mediante el uso de paquetes
Ocultacin de la informacin, mediante tipos de datos privados y privados
limitados Instancias de estos tipos de datos slo se pueden manipular por
los subprogramas especificados en el paquete que define los tipos de datos
privados; un tipo privado de Ada es un tipo abstracto de datos
Sobrecarga de operadores, funciones y procedimientos
Genericidad, mediante paquetes y subprogramas genricos
Herencia, aunque Ada no soporta la propiedad de la herencia, es posible
emular la pseudoherencia mediante la definicin de tipos de datos derivados, aunque no es posible tener propiedades adicionales de datos o modificacin de las propiedades de datos existentes

4.3..1. Abstraccin de datos en Ada


En Ada los tipos abstractos de datos se implementan mediante paquetes; si bien
los tipos abstractos de datos sirven adems para una gran variedad de aplicaciones
Un paquete Ada consta de dos partes:
Especificacin del paquete, que declaia los nombres de los tipos, subprogramas y objetos que son visibles a los usuarios del paquete
Cuerpo del paquete, que contiene la implementacin de los componentes
que son ocultos a los clientes del paquete
L.os formatos para definir la especificacin y el cuerpo de un paquete son:
package <nombre_paqwete> is
<elementosdeclarativos>
[private
<elementos_declarativoc>]
end <nombresaquete>,

espe~ficaci6ndel paquete

package body <nombresaquete> is

cuerpo del paquete

end cnombre_pawete> ,

127

package Tipo-Complejo is
type complejo is private
function " + " (izda, dcha:complejo) return complejo;
function " - " (izda, dcha:complejo) return complejo;
function " * " (izda dcha:complejo) return complejo;
function 1 " (izda, dcha:complejo) return complejo;
function " - ' (dcha:complejo) return complejo;
private
type complejo is record
re:float : = O 0;
im:float : = O 0;
end record;
end Tipo-Complejo;

Los tipos privados peiiniteii que se definan nuevos tipos de datos, mientras
se oculta su implementacin real Al igual que otros tipos, los tipos privados
se declaran dentio de una especificacin de paquete Un tipo privado se declara en la parte visible de un paquete, pero la definicin real de su estructura
interna se especifica en la parte privada de la especificacin del paquete La
estructura del tipo definido en la parte privada es accesible slo dentro del
cuerpo del paquete
Las operaciones permitidas en tipos privados son asignacin, pruebas para
igualdad y desigualdad, y cualquier opeiacin definida explcitamente dentio
de la especificacin del paquete
Ada proporciona tambin una definicin de un tipo privado ms limitado,
denominado privado liinitado La diferencia principal es que el tipo privado
limitado no hereda automticaineiite operadores para asignacin y pruebas de
igualdad y desigualdad Una instaiicia de un tipo privado limitado slo se
puede copiar en, o compararlo con, otra instancia si las operaciones necesaiias
han sido especificadas e implementadas por el paquete que declara el tipo de
dato privado limitado Ada no permite que se sobrecaigue el operador de
asignacin, de modo que una iinplementaciii de usuario de esta operaciii
para un tipo de dato privado limitado se ha de especificar como un procedimiento con iiombre

4.3.2.

Genericidad en Ada

Ada sopoita genericidad Las unidades genricas son subprogiamas o paquetes


parametiizados que permiten al usuario desarrollai cdigo reutilizable El foimato de una unidad genrica es:

128

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos

La instanciacin de una unidad genrica crea una copia de la unidad


genrica, Los parmetros genricos se corresponden con los parmetros reales
durante la iustanciacin Se especifican tipos reales para todos los tipos formales
genricos Una variable o una constante se especifica para todos los objetos
genricos brmales Un nombre de funcin o subprograma se da a cualquier
subprograma genrico As, por ejemplo, para instanciar un subprograma genrico I n t e r c a m b i o , que intercambia entre s el contenido de unas variables:

como un leizguaje basado en objetos, en base a que soporta todo el concepto de


tipo abstracto de datos La Figura 4 5 muestra las caractersticas de 00 de
Ada, as como sus carencias
Ada-83 soporta

procedure Intercambio_INrEGER is new Intercarhio(1NTEGER);

Ada-83 no soDorta

Tambin se puede instanciar un procedimiento llamado intercambioEmpleado, que intercambia dos registros empleado:
procedure Intercambio-Empleado is new Intercambio(Emp1eado);

Ada-95 sooorta
1

Ada-8.3 izo soporta herencia, pero s un tipo de pseudo-herencia, de modo


que una declaracin de tipo de dato puede especifica1 que el tipo de dato
se deriva de un tipo de dato ya existente As, a partir del tipo complejo,
definido anteriormente, se puede declarar otro tipo Tipo-complejo, del modo siguiente:
with Tipo-Complejo;
ic new Tipo-Complejo

Genericidad
Sobrecarga (no totalmente)
Verificacin esttica de tioos
Encapsulamiento
Ocultacin de la informacin
Herencia
Polimorfismo
Extensibilidad
Herencia
Polimorfismo
Extensibilidad

1
i

Figura 4 5

4..3.3. Soporte de herencia en Ada-83

package Ejemplo i s
type otro_tipo-complejo

129

Complejo;

Un mtodo acreditado de diseo basado en Ada se denomina Hierurchical


Object Oiieizted Design (HOOD), por lo que puede inducir a confusin entre
descomposicin jerrquica de objetos, nica posibilidad con Ada, y las verdaderas jerarquas de clases que soportan abstracciones mediante generalizaciones y especializaciones
El proyecto Ada 9x, cuyo borrador definitivo se conoce como Ada-95, ha
definido un nuevo estndar de Ada publicado e11 1995, tanto por ISO como por
ANSI, que propoiciona soporte completo orientado a objetos, aunque con
ciertas restricciones todava sobre C + + , pero tambin con notables ventajas,
como es el caso de la concurrencia

end Ejemplo;

Un tipo derivado Ada hereda todas las opetaciones declaradas para el tipo
base y stas se pueden redefinir para el nuevo tipo y especificadas operaciones
adicionales. Sin embargo, si el tipo base es privado, el nico modo de implementar cualquier operacin adicional o redefinida es a travs del uso de operaciones del tipo base; no existe en Ada el concepto de acceso protegido de C++
No es posible especificar nuevas propiedades de datos para un tipo derivado en Ada, y en consecuencia, todos los tipos derivados de un tipo base tienen
la misma representacin
El soporte de herencia de Ada no se puede utilizar para capturar abstracciones generalizadas, como un tipo de dato base abstracto (clase abstracta en
C+f ), de las que se puedan derivar tipos de datos abstractos Ada tampoco
soporta ninguna forma de ligadura dinmica ni de poliinorfismo

4.3..4. Soporte Ada para orientacin a objetos


Las grandes limitaciones de mtodo de herencia de Ada y su ausencia de soporte de polimorfismo no permiten que Ada pueda ser utilizado como un lenguaje
de programacin orientado a objetos A lo mximo, Ada se puede considerar

Eiffe13es un lenguaje orientado a objetos puro desaiiollado por Bertran Meyer


de Interactive Software Environments Inc Su diseo se inspir en Simula, pero
tambin muestra la influencia de Smalltalk y Ada Adems incorpora modernas
tcnicas de ingeniera de software, que lo hacen idneo para construccin de
software para grandes aplicaciones, permitiendo desarrollar aplicaciones robustas, exactas, transportables y eficientes.
Eiffel es un lenguaje compilado tipificado fuertemente, que soporta la
mayora de los conceptos orientados a objetos descritos en los captulos anteriores, tales como abstracciil de datos mediante clases, genericidad, herencia
(simple y mltiple), ligadura dinmica y polimorfismo 'Tambin proporciona
una amplia biblioteca de clases y soporta recoleccin de basura (garbage collection) El entorno Eiffel est especialmente concebido pala reas de ingeniera de
software, tales como bases de datos o inteligencia artificial, y tiene un soporte
muy limitado para objetos persistentes y concurrencia, aunque ambas carac-

' MEYER,Bertrand: Ohjeit-Oiiriiied

Softivaie Cuitsrruiiioii Prentice-Hall. 1988

130

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos

tersticas han sido prometidas por sus diseadores [Meyer, 19881 y en trabajos
posteriores Las caractersticas de Eiffel se resumen en la Tabla 41,
Tabla 4 . , 1 Caracteristicac de Eiffel
-

Ocultaciii de la iiiformacin
Herencia
Verificacin/ligadura de tipos
Polimorfismo
Recoleccin de basura
Persistencia
Concurreiicia
Genericidad
Biblioteca de objeios

S
S (simple y mltiple)
Tempiana
S
S
Pseudo-persistencia
Prometida
S
Pocas

Eiffel soporta conceptos de ingeniera de software tales como precondiciones, poscondiciones e invariantes de clases Estas caractersticas y las propias de
orientacin a objetos lo hacen muy til para construir, soportar y mantener
proyectos de software grandes

4.4.1 .

La biblioteca de clases Eiffel

El entorno de programacin Eiff'el proporciona una biblioteca de clases predefinidas muy grande, Las clases predefinidas van desde clases de estructura de
datos, apoyo y de ncleo (Keiizel), hasta clases grficas que soportan puntos,
rectngulos, etc
La biblioteca de clases de grficos avanzados sopoita el sistema XWindow,
lo que permite al programador construir interfaces de usuaiio sofisticados

4.4.2.

El entorno de programacin Eiffel

El compilador Eiffel, un ho,jeador de clases (browser), un editor y las herramientas Jlat y shol t son las partes fundamentales del entorno de programacin
Eiffel.
El compilador Eiffel tiene una caractetstica de recompilacin automtica
Recompila slo aquellas clases que estn afectadas por un cambio El hojeados de clases permite el examen de clases en el contexto de sus jerarquas
(superclases y subclases), pudiendo visualizar las relaciones existentes entre
clases
La gestin de memoria en Eiffel se realiza p o ~el entorno de p~ograinacin
El espacio de ob.ietos se asigna cuando se crean objetos Eiflel proporciona
recoleccin automtica de basura Se coinprueba cuando un objeto se vuelve
obsoleto y libera su espacio asociado Eiffel soporta tambin un mecanismo de
manejo de excepcioiies

131

4.4.3.. El lenguaje Eiffel


El nico criterio de estructuracin en Eiffel es la clase Una clase es una unidad simple y no se separa en una parte interfaz y en una parte implementacin
Una clase en Eiffel define los elementos bsicos de sus objetos instancia: variables de instancia, mtodos de instancia y un mtodo de clase Las variables de
instancias se llaman tambin atributos, los mtodos de instancia se llaman
tambin rutinas y los atributos y rutinas se llaman colectivamente caracterirticas
L.a clase P e r s o n a se representa con un cdigo similar a:
class Persona
creation
crea
feature
n0mbre:CTRWG;
conyuge: Persona;
feature (PERSONA) casado (n:PERSONA) is
do
conyuge : =n
end:
feature
crea (c:STRING) is do
nombre : = S ;
end
casado-con (p: PERSONA) is
require
existe : p/=void;
solteros: (conyuge=void and y conyuge=vaid)
do
casado (p);
p casado (actual)
ensuze
boda_valida:conyuge=y and actual=p conyuge
end
end

La clase E s t u d i a n t e que se deriva de Persona podr ser:


class Estudiante
inherit
Persona
rename imprimir as imprimirpersona
redefine imprimir
end;
creation
hacer
feature (NONEI
es:STDFILES;
feature
hacer x (n=STRING) is
do

132

Lenguajes de programacin orientados a objetos

Programacin orientada a objetos


nombrepersona : = n;
end
imprimir is
do
e s putctring ("Estudiante: 1 ;
imprimirpersona;
end;
end

Una de las caiactersticas ms sobresalientes de Eiffel es soportar el concepto de coiltrato entre el proveedor (servidor) de una clase y el usuario de una
clase El proveedor o implementador de una clase es capaz de especificar, como
parte de la definicin de la clase en Eiffel, bajo qu condiciones los objetos de la
clase se comportan correctamente En Eiff'el, estas condiciones se expresan, de
la siguiente forma:

Piecoizdiciones, que se deben cumplir untes de que se invoque un mtodo


Poscoizdicioizes, que se garantizan han de cumplirse despus de que un
mtodo se ha ejecutado
Invariantes, que siempre son verdaderas para todas las iuptancias de una
clase
El contrato eiitre el proveedor y el usuario de una clase espera que:
El usual io de una clase asegurar que las precondiciones de un mtodo se
cumplan antes de que el mtodo se invoque
El pioveedoi de la clase gaiantizar que las poscondiciones se cumplan
despus que se ha aplicado el mtodo

133

4.5.,1.. El lenguaje Smalltalk


El bloque fundamental bsico de un programa Smalltalk es la clase La clase
contiene la descripcin de variables de instancia y mtodos El mtodo es el
equivalente al trmino funcin iniembro de ++ Al igual que en C + + , los
mtodos contienen el cdigo que definen cmo responde un objeto a un mensaje La forma bsica de una sentencia Smalltalk es un mensaje enviar:
8

ecepto? mensaje al.gumento

que expresa cmo un mensaje se enva a un receptor con un argumento


Smalltalk es un lenguaje totalmente dinmico Los mtodos se buscan cuando un objeto recibe un mensaje La ligadura esttica no es una opcin en Smalltalk La 'Tabla 4 2 relaciona los trminos equivalentes entre C + + y Smalltalk
Tabla 4,,2. C++ frente a Smalltalk,,

Clase
Supeiclase
Subclase
Variable de clase
Variable de instancia
Mtodo de una clase
Mtodo instancia

Clase
Clase base
Clase derivada
Campo miembro esttico
Campo miembro
Funcin miembro esttica
Funcin miembro

La Tabla 4 3 contiene las caractersticas ms sobresalientes de Smalltalk

4.5.

SMALLTALK

Smalltalk es el primer lenguaje creado con tecnologa de objetos puros Fue


desairollado al piincipio de los setenta por Alan Kay y Adele Golberdg en el
Software Concepts Group de Xerox Palo Alto Research Center En la actualidad Smalltalk comienza a imponerse como uno de los primeros lenguajes de
programacin orientados a objetos.
La primera versin comercial de Smalltalk se lanz en 1983 con el nombre de Smalltalk-80 En u11 principio slo estuvo disponible para potentes
estaciones de trabajo grficas Smalltalk, en el sentido ms estricto, es un
entorno de progiamacin interactivo y requiere gran cantidad de memoria En
la actualidad las versiones de Smalltalk corien bajo entornos Windows, OS12 y
UNIX
En esencia, el entorno de progiamacin Smalltalk tiene tres componentes:
el lenguaje b~icoSnzalltalk, una coleccin de clases, que se utilizan para implementar el sistema Smalltalk completo, y el eiztorno leal de progranzaciiz,
que permite a un programador introducir, comprobar y ejecutar aplicaciones
Smalltalk,

Tabla 4 3. Caractersticas d e Smalltalk


Polimorfismo
Ligadura/Verificacin de tipos
Ocultacin de la informacin
Concurrencia
Herencia simple
Herencia mltiple
Recoleccin de basura
Genericidad
Persistencia

S
Tardia
S

Pobre
S

No
Si
No

No

Smalltalk no es un lenguaje hbrido, como C + + , sino un lenguaje puro, que


no permite un estilo de programacin convencional Es el lenguaje de programacin ms dinmico de los conocidos y dispone de un entorno de programacin excelente, aunque tiene el inconveniente de teneI una velocidad de ejecucin pequea Otro inconveniente de Smalltalk es ser un sistema de un solo
usuario

134

Programacin orientada a objetos


Lenguajes de programacin orientados a objetos

Por el contrario, el desariollo de aplicaciones en Smalltalk tiende a ser muy


rpido Adems, dado que el cdigo de Smalltalk se compila incrementalmente,
las nuevas definiciones de clases y objetos se vuelven eficaces tan pronto como
se introducen El alto grado de interactividad del entorno Smalltalk lo hace
altamente productivo para desarrollos rpidos

4..5.2.. La jerarqua de clases Smalltalk


El entorno de programacin incluye una amplia biblioteca de varios centenares
de clases Para gestionar esta gran lista de clases, Smalltalk las agrupa en
categoras L.as categoras de clases implementan muchas estructuras de datos
bsicos: colecciones, conjuntos, bolsas, diccionarios, etc Adems, existen clases
predefinidas que iealizan entradas y salidas y ayudan a desarrollar componentes de interfaces de usuarios; algunas clases de esta categora son: Punto,
Rectngulo, F o r m a , V i s t a

La Figura 4 6 muestra una parte de la jerarqula de clases de Smalltalk

Figura 4 6

Jerarqua Taylor de clases d e Smalltalk,

4.6. OTROS LENGUAJES DE PROGRAMACION


ORIENTADOS A OBJETOS
Hoy da se puede aventurar que existen muy pocos lenguajes comercializados
que no tengan versiones orientadas a objetos, tal vez sea FORTRAN el nico
lenguaje que no soporta estas caractersticas
La mayora de los lenguajes estructurados modernos presentan una versin
que es hbrida Los casos ms sobresalientes son:

135

aersiiz hibrida de Pascal


Turbo Pascal (Object Pascal)
vei siii Iiihrida de Clipper
Visual Object
uei siiz hibrida de Iui,bo Parcal
Delphi
versin lzihrida de COBOL,
Object COBOL
Visual BASIC 4 (no iizcorpoia propiedades de heleizcia ni de polinzorfisnzo)
versin hibrida de C
C++

El lenguaje C + + se estudia y analiza en profundidad en la segunda y


tercera parte de este libro, y es la base fundamental de todo el desarrollo del
mismo. Los Apndices A, B, C, D y E muestran unas guas rpidas de los
lenguajes C + + , Turbo/Borland Pascal 7, Delphi, Ada-95 y lava

RESUMEN
El auge de las tecnologas de orientacin a objetos se ha debido fundamentalmente a la existencia y posterior popularidad de numerosos lenguajes de programacin orientados a objetos
En la dcada de los sesenta, los diseadores del lenguaje Simula introdujeron el concepto de objeto Conceptualmente, un objeto contena tantos datos
como operaciones que manipulaban esos datos Simula incorpor tambin la
nocin de clases que se utilizaban para describir la estructura y comportamiento de un conjunto de objetos Otra caracterstica importante soportada por
Simula fue la herencia de clases
Durante la dcada de los setenta y principio de los ochenta, los conceptos
de orientacin a objetos de Simula se pasaron a Smalltalk, uno de los lenguajes
orientados a objetos ms influyentes en el desarrollo de las tecnologas de
objetos Este lenguaje incorporaba muchas de las caractersticas orientadas a
objetos de Simula, incluyendo clases y herencia Pero Smalltalk aadi una
caracterstica muy notable: la incorporacin de un entorno de programacin
completo y un interfaz de usuario interactivo basado en mens,
Smalltalk es muy rico en conceptos orientados a objetos En Smalltalk todo
es un objeto, incluyendo clases y tipos base,
La taxonoina de lenguajes de Wegner clasificaba stos en basados en objetos, basados en clases y orientados a objetos
Los lenguajes basados en objetos ms populaies son Ada, Modula-2, Clipper 5-2 Los lenguajes basados en clases se agrupan en torno a Cla Los lenguajes orientados a objetos se clasifican en dos grandes bloques: puros e hibridos
Lenguajes orientados a objetos puros son Simula, Smalltalk y Eiff'el, y lenguajes orientados a objetos hbridos son Object Pascal (Turbo Pascal y Borland Pascal), Objective-C, Object COBOL, Overon, C + + , Delphi, etc
El lenguaje 00 hbrido por excelencia es C + + , aunque en los ltimos aos
estn apareciendo otros lenguajes hbridos que comienzan a competir con cierto xito, tales como Object COBOL, Visual Object, Visual BASIC 4, Delphi,
etctera
En los lenguajes 00 puros todo es un objeto, incluso las definiciones de
tipos, mientras que en los lenguajes hbridos no todo necesita ser un objeto

136

Programacin orientada a objetos

Las grandes ventajas de los lenguajes hbridos son:


Perodo de aprendizaje (los programadores ya experimentados en versiones no orientadas a objetos pueden comenzar con facilidad a utilizar las
versiones 00).
Se pueden utilizar las enormes cantidades de cdigo puente existente
(cdigo heredado) C++se dise de modo que pudie~acompilar cdigo
estndar C con pocas o ninguna modificacin; de igual forma, Delphi se
ha diseado para compilar programas anteriores de Turbo/Bo~landPascal con cambios mnimos

MODELADO DE OBJETOS:
RELACIONES

EJERCICIOS
4.1. Describa y justifique los objetos que obtiene de cada uno de estos casos:
a) Los habitantes de Europa y sus direcciones de correo.

b) Los clientes de un banco que tienen una caja fuelte alquilada


c ) Las direcciones de correo elect~nicode una universidad
d) Los empleados de una empresa y sus claves de acceso a sistemas de
seguridad
42

Cules seran los objetos que han de considerarse en los siguientes sistemas?
a) Un programa para maquetar una revista
b) Un contestador telefnico
c) Un sistema de control de ascensores
d) Un sistema de suscripcin a una revista

4.3.
4.4.

Deducir los objetos necesarios para disear un programa de computadora que permita jugar a diferentes juegos de cartas
Dibujar un diagrama de objetos que represente la estructura de un coche
(cano) Indicar las posibles relaciones de asociacin, generalizacin y
agregacin

4.5. Dibujar diagramas de objetos que representen la je~arquade objetos del


modelo Figura

CONTENIDO
5 1 Relaciones entre clases
5,,2 Relacin de generalizacin/especializacin (is-a/es-un)
5 , 3 Relacin de agregacin (has-a/tiene-un)
5 . 4 Relacin de asociacin
5 5 . Herencia: jerarqua de clases
5 6 . Herencia repetida
RESUMEN
EJERCICIOS

La orientacin a objetos (POO) intenta modelar aplicaciones


del mundo real tan fielmente como sea posible, apoyndose
para ello en una gran facilidad de reutilizacin y extensibilidad
del software El potente concepto 00 que proporciona todas
estas caractersticas e s la herencia,
A travs de la herencia, los disetiadores pueden construir
mdulos de software (tales como clases) Las nuevas clases
pueden heredar tanto el comportamiento (behaviour, operaciones, mtodos, e t c ) como la representacin (variables de
instancia, atributos, e t c ) a partir de las clases existentes,,
La herencia e s la caracterstica que diferencia esencialmente la programacin orientada a objetos de la programacin tradicional, debido fundamentalmente a que permite extender y reutilizar el cdigo existente sin tener que rescribir el
cdigo,
En este capitulo analizaremos las relaciones fundamentales entre clases el concepto de herencia y su modo d e implementacin en un lenguaje orientado a objetos, as como las
otras relaciones entre clases, agregacin y asociacin.,

138

5.1. RELACIONES ENTRE CLASES


Las relaciones entre clases juegan un papel importante en el modelo de objetos
Las clases, al igual que los objetos, no existen de modo aislado Por esta razn
existirn ielaciones entre clases y entre objetos
L.as relaciones entre entidades, clave del modelo relaciona] de datos, se
expresan utilizando verbos a partir de frases del lenguaje ordinario, tales como
vive-en, estudia-en, trabaja-para
Las relaciones entre clases, como indica Booch', se deben a dos razones:
Primera, una relacin de clases puede indicar algn tipo de comparticin (por
ejemplo, margaritas y rosas son ambas tipos de flores) Segunda, una relacin
entre clases puede indicar algn tipo de conexin semntica; por ejemplo, las
rosas rojas y amarillas son ~ n sparecidas entre si que las margaritas y rosas
Los tres grandes tipos de relaciones entre clases son:
e

Modelado d e objetos: relaciones

Programacin orientada a objetos

Gerzeralizuci~z/especializaci6n(es-un).,
Agregacin (tndnlparte).,
Asociacin

La primera de ellas es la generalizacin, que representa una relacin un tipo


de Por ejemplo, una rosa es un tipo de flor, significando que una rosa es una
subclase especializada de la clase ms general, flor Este tipo de relacin se
conoce como relacin es-un (ir-a) La segunda es agregacin, que representa
urza parte de la relacin. Por consiguiente, un ptalo no es una clase de flor; es
una parte de una flor Esta relacin tambin se conoce como relacin tiene
(has) La tercera relacin es la asociacin, que representa conexin semntica
eiitie clases no relacionadas As, por ejemplo, rosas y velas son clases independientes, aunque ambas representan cosas que se pueden utilizar para decorar
una mesa para cenar

139

Las rosas rojas y amarillas son tipos de rosas


Un ptalo es una parte de ambos tipos de flores
Como Booch afirma, las clases y objetos no pueden existir aislados, y en
consecuencia existirn entre ellos relaciones Las relaciones entre clases pueden
indicar alguna fotma de comparticin, as como algn tipo de conexin semntica Por ejemplo, las margaritas y las rosas son ambas tipos de flores, significando que ambas tienen ptalos coloreados brillantemente, ambas emiten fragancia, etc La conexin semntica se materializa en el hecho de que las rosas
rojas y las margaritas y las rosas estn ms estrechamente relacionadas entre s
que lo estn los ptalos y las flores
Las clases se pueden organizar en estructuras jerrquicas La herencia es
una relacin entre clases donde una clase comparte la estructura o comportamiento, definida en una (herencia simple) o ms clases (herencia mltiple). Se
denomina superclase a la clase de la cual heredan otras clases. De modo similar,
una clase que hereda de una o ms clases se denomina subclase Una subclase
heredar atributos de una superclase ms elevada en el rbol jerrquico La
herencia, por consiguiente, define un tipo de jerarqua entre clases, en las que
una subclase hereda de una o ms supe~clases
La Figura 5 1 ilustra unaje~arquade clases Animal, con dos subclases que
heredan de Animal, Mamferos y R e p t i l e s

(Mamfero )

Las relaciones se expresan frecuentemente utilizando verbos o frases verbales del lenguaje natural, tales como vive-ea, estudia-en, es-responsable-de
Figura 5 1 , Jerarquia de clases

Booch2, para mostrar las semejanzas y diferencias entre clases, utiliza las siguientes clases de objetos: flores, margaritas, rosas iojas, rosas amarillas y
ptalos Se puede constatar que:
Una margarita es un tipo (una clase) de flor
Una rosa es un tipo (diferente) de flor

' Booc~,Grady: Objeit-Oriented Aiialysis nnd Desiyiz ivith Appiicatioiis Benjamin/Cummings,


2 " edicin, 1994
"ooc~, Giady: Object-Oriented Deriyn ivith Appliiationr Benjamin/Cummings, 1991, pgs
96-100

Herencia es la propiedad por la cual instancias de una clase hija (o subclase)


puede acceder tanto a datos como a comportamientos (mtodos) asociados con
una clase padre (o superclase) La herencia siempre es transitiva, de modo que
una clase puede he~edarcaractersticas de superclases de nivel superior Esto es,
si la clase p e r r o es una subclase de la clase mamfero y de a n i m a l
Una vez que una jerarqua se ha establecido es fcil extenderla Para describir un nuevo concepto no es necesario describir todos sus atributos Basta
describir sus diferencias a partir de un concepto de una jerarqua existente La
herencia significa que el comportamiento y los datos asociados con las clases
hija son siempre una extensin (esto es, conjunto estrictamente ms grande) de
las propiedades asociadas con las clases padres Una snbclase debe tener todas las propiedades de la clase padre y otras El proceso de definir nuevos tipos

140

Modelado de objetos: relaciones

Programacin orientada a objetos

y reutilizar cdigo anteriormente desarrollado en las definiciones de la clase


base se denomina plogramacin por herencia Las clases que heredan propiedades de una clase base pueden, a su vez, servir como clases base de otras clases,
Esta jerarqua de tipos normalmente toma la estructura de rbol, conocido
como jerarquia de clases o jerarqua de tipos
La jerarqua de clases es un mecanismo muy eficiente, ya que se pueden
utilizar definiciones de variables y mtodos en ms de una subclase sin duplicar
sus definiciones Por ejemplo, consideremos un sistema que representa varias
clases de vehculos manejados por humanos Este sistema contendr una clase
genrica de vehculos, con subclases para todos los tipos especializados La
clase v e h c u l o contendr los mtodos y variables que fueran propios de todos
10s vehculos, es decir, nmero de matrcula, nmero de pasajeros, capacidad
del depsito de combustible La subclase, a su vez, contendr mtodos y variables adicionales que sern especficos a casos individuales

141

5.2.1. Jerarquas de generalizacinlespecializacin


Las clases con propiedades comunes se organizan en superclases
Una superclase representa una generalizaciiz de las subclases De igual
modo, una subclase de una clase dada representa una especializaci~zde la clase
superior (Fig 5 4) La clase derivada es-un tipo de clase de la clase base o
super clase,
es-un

es-un
Vehculo
carga
.

. .
es-un f-'\es-un
de pasajeros

wq

es-un f

t\ es-un

de pasajeros

Camin
L..

1
'

Figura 5 2

Subclases de la clase Vehculo,,

L.a flexibilidad y eficiencia de la herencia no es gratuita; se emplea tiempo en


buscar una jerarqua de clases para encontrar un mtodo o variable, de modo
que un programa orientado a objetos puede correr ms lentamente que su
correspondiente convencional Sin embargo, los diseadores de lenguajes han
desarrollado tcnicas para eliminar esta penalizacin en velocidad en la mayora
de los casos, permitiendo a las clases enlazar directamente con sus mtodos y
variables heredados de modo que no se requiera realmente ninguna bsqueda,

eado )

(.~studiante)

6
Vendedor

Figura 5 3 . Una jerarqua Persona

Figura 5 4

Relacin de generalizacin,

Una superclase representa una generalizacin de las subclases Una subclase


de la clase dada representa una especializaci~zde la clase ascendente (Figura 5.5),
En la modelizacin o modelado orientado a objetos es til introducir clases
en un cierto nivel que puede no existir en la realidad, pero que son construcciones conceptuales tiles Estas clases se conocen como clases abstractas y su
propiedad fundamental es que n o se pueden crear instancias de ellas Ejemplos
de clases abstractas son VEHICULO DE PASAJEROS y VEHICULO DE MERCANCIAS Por otra parte, de las subclases de estas clases abstractas, que corresponden a los objetos del mundo real, se pueden crear instancias directamente por s
mismas Por ejemplo, de BMW se pueden obtener, por ejemplo, dos instancias,
Coche1 y Coche2,
La generalizacin, en esencia, es una abstraccin en que un conjunto de
objetos de propiedades similares se representa mediante un objeto genrico El
mtodo usual para construir relaciones entre clases es definir generalizaciones
buscando propiedades y funciones de un grupo de tipos de objetos similares,
que se agrupan juntos para formar un nuevo tipo genrico Consideremos el

Programacin orientada a

142

Mamfero

Modelado de objetos. relaciones

objetos

Persona

Vehculo

es-un

es-un

Hombre

&
i
<5
es-un

Generalizacin

lnformtico

143

La jerarqua de generalizacin/especializacin tiene dos caractersticas fundamentales y notables Primero, un tipo objeto no desciende ms que de un
tipo objeto genrico; segundo, los descendientes inmediatos de cualquier nodo
no necesitan ser objetos de clases exclusivas mutuamente Por ejemplo, los
g e r e n t e s y los i n f o r m t i c o s no tienen porqu ser exclusivos mutuamente,
pero pueden ser tratados como dos objetos distintos; es el tipo de relacin que
se denomina gerieralizacii~mltiple,

Especializacin
&
e

es-un

Gerente

Empleado

Lt X
lnformtico

es-un/y

Oficinista
(a)

(c)

(b)

Figura 5 5. Relaciones de jerarqua es-un (1s-al: (a), (c) generalizacin;


(b) especializacin.
caso de empleados de una compaa que pueden tener propiedades comunes
(nombre, nmero de empleado, direccin, etc) y funciones comunes (calcular-nmina), aunque dichos empleados pueden ser muy diferentes en atencin
a su trabajo: oficinistas, gerentes, programadores, ingenieros, etc En este caso,
lo normal ser crear un objeto genrico o superclase empleado, que definir
una clase de empleados individuales Po1 ejemplo, a n a l i s t a s , programadores y o p e r a d o r e s se pueden generalizar en la clase i n f o r m t i c o , Un programador determinado ( ~ o r t i m e r ser
)
miembro de las clases proarama.
dor , l n f o r m t i c o y empleado; sin embargo, los atributos significativos de
este programador variarn de una clase a otra
~

Programador

Figura 5 7 . Una jerarqua de generalizacin multiple,

Una agregacilz es una relacin que representa a los objetos compuestos Un


objeto es colnpuesto si se compone a su vez de otros objetos Una casa se
compone de habitacioiies, tejados, suelos, puertas, ventanas, etc Una habitacin, a su vez, se compone de paredes, techos, suelo, ventanas y puertas (Figura 5 8)

tiene
tiene

Habitacin

lnformtico

es-u/

tiene
Tejados

\es--

/ es-un

Figura 5 6 Una jerarqua de generalizacin de empleados

Puertas

/1

Ventanas

Paredes

Figura 5 8 Un objeto compuesto (casa) y sus componentes,

144

Programacin orientada a objetos

Modelado de objetos. relaciones

La agregacin de objetos permite describir modelos del mundo real que se


componen de otros modelos, que a su vez se componen de otros modelos La
agregacin es un concepto que se utiliza para expresar tipos de relaciones entre
objetos parte-de (par t-of) o tiene-un (has-a) El objeto componente, tambin a
veces denominado continente o contenedor, es un objeto agregado que se compone de mltiples objetos
La agregacin es una forma especfica de asociacin y no un comportamiento independiente, que aade significados o connotaciones semnticas en
ciertos casos Dos objetos forman un agregado, o existe entre ellos una relacin
de agregacin, si existe entre ellos una relacin todo-parte, continente-contenido
(whole-part) Si dos objetos se consideran normalmente como independientes,
sus relaciones se consideran normalmente una asociacin Rumbaugh et al3,en
la obra ya citada, sugiere las siguientes pruebas para determinar si una relacin
es una agregacin:
Se utiliza la frase parte-de (tiene-un, consta-de , ) para describir la relacin?
L.as operaciones del todo, se aplican automticamente a sus partes?
Los valores de los atributos, se propagan del todo (completo) a todas o
algunas partes?
Existe una asimetra intrnseca a la asociacin en la que una clase de
objetos se subordina a la otra?

145

un CHASIS,etc , que son a su vez parte-de COCHE,representa un ejemplo de una


agregacin con contenido fsico (Fig 5 9)

0
Transmisin

Figura 5 9 . Agregacin con contenido fisico,

La agregacin no implica siempie contenido fsico, coino en el caso de


COCHE,sino que puede implicar simplemente relaciones conceptuales As, un
EDIFICIO puede componerse de DIVISIONES, que a su vez constan de
OFICINAS, O bien una COMPAIA consta de varios DEPARTAMENTOS y cada
DEPARTAMENTO consta de varias SECCIONES

Si se responde afirmativamente a cualquiera de estas preguntas, se tiene una


agregacin
La agregacin puede ser de dos tipos: por contenido fisico4, o por contenido
por referencia o conceptual
La agregacin por contenidofisico (Fig 5 9 ) o por valor implica que un objeto
contenido no existe independientemente del objeto contenedor La vida de
ambos objetos est ntimamente relacionada,

Figura 5 , l O Agregacin sin contenido fsico

Cuando se crea un sintagma de la clase (un objeto) 01, se crea una instancia
de la clase 02 (otro objeto) Cuando se destruye un objeto del contenedor 01,se
destruye otro objeto de 02
El objeto agregado COCHE5se compone de un MOTOR,una TRANSMISION,

--

' En la obra Object-Oi iented Modeiiiig and Desigii, de JAMES RUMBAUGH


et al se muestra uno
de los meiores estudios existentes sobre modelos de obietos
GRADY BOOCHdefine estos dos trminos en su obra, ya citada, Object-Oriented Analyiir and
Design 2.' edicin
En Latinoamrica se utiliza como acepcin usual de autor>~uiila palabra carro
~~

En la agregacin por referencia, conceptual o sin contenidofisico existe fuerte


dependencia entre objetos de las clases continenteJcontenido y no estn acoplados entre ellos Eso significa que se pueden crear y destruir instancias de clase
independientemente

5.3.1. Agregacin frente a generalizacin


La agregacin es diferente de la generalizacin La generalizacin relaciona las
clases constituyendo un modo de esttucturar la descripcin de un objeto nico
Con la generalizacin, un objeto es simultneamente una instancia de la superclase o clase base y una instancia de la subclase Una superclase se compone de
propiedades que desctiben un objeto (relaciones es-un, un-tipo-de)

146

Programacin orientada a objetos

Modelado de objetos. relaciones

Una agregacin relaciona instancias de objetos: un objeto es parte de otro


objeto Las jerarquas de agregacin se componen de ocurrencias'de objetos
que a su vez son parte de un objeto contenedor (relacin parte-de, tiene-triz)
i elacziz

i elaciiz

de genei alizaciiz
de agi egaciiz

es-u12
parfe-de

un-tipo-de
tiene-un

Las jerarquas complejas de objetos suelen consta1 de relaciones de agregacin y de generalizacin. Este es el caso de los dispositivos Avin que incluyen
en su jerarqua ambos tipos de relaciones

Avin

147

Una propiedad importante intrnseca a la relacin de asociacin o multiplicidad es la caidinalidad o inultiplicidad La multiplicidad es la propiedad que
expresa el nmero de instancias de una clase que se asocian o conectan con
instancias de la clase asociada Esta propiedad ya fue introducida por Chen
para definir el modelo entidad-relacin (E/R) Existen tres tipos de multiplicidad o cardinalidad:
Una a una
Una a muchas
Muchas a muchas
Una relacin una-a-una implica una relacin estrecha entre objetos Por
ejemplo, una relacin entre una clase Venta de un producto y la clase operacinTC que representa la operacin o pago de la venta mediante una t a ~ j e t ade
crdito

de carga

aterrizaje

Cabina

E
Boeing

Jumbo

Cada venta se corresponde coi1 una operacin de una tarjeta de crdito y a


la inversa Otio ejemplo es la relacin entre PAIS y CAPITAL Un pas tiene
una capital y slo una, y una ciudad que es capital de un pas slo pertenece a
un pas

Concorde

Figura 5 , l l Jerarqua compleja de agregaciones y generalizaciones

r;
.

-.

- --

- - . --

relacign.de agregacin s e implementa mediante objetos compuestos.


.

. .

Una relacin una a muchas se puede ver entre las clases PAIS y CIUDAD Un
pas tiene muchas ciudades, mientras que una ciudad slo pertenece a un pas
Una asociacin representa una dependencia semntica entre clases e implica la
direccin de esta dependencia En general, las asociaciones son bidireccionales,
aunque pudiesen ser unidireccionales si as se indica expresamente.
Una relacin de asociacin define una relacin de pertenertcia. Para encontrar relaciones de asociacin es preciso buscar frases tales como cpeitenece a,
es iniembro de, est asociado con, *trabaja para, etc
Juan Mackoy

trabaja-para
IBM

Las asociaciones pueden ser unitarias, binarias, ternarias o de cualquier


otro orden, aunque la mayora sern binarias

Ciudad

Otro ejemplo se da entre la clase LINEA, CIRCUNFERENCIA,o en general


y la clase PUNTO Cualquier figura puede tener muchos (infinitos) puntos, y un punto se asocia a una figura

FIGURA

Punto

Las clases Venta y Articulo se enlazan tambin por una relacin unanzuchas Una venta puede constar de muchos artculos

148

Programacin orientada a objetos


..-\

,,

--'

Venta

Modelado de objetos: relaciones

...

,
.'1

\.-.'

- *

.-

n :'

,.. Articulas !
,
.. -----,

149

5.,4..1. Otros ejemplos de cardinalidad

.-..s

Por ltimo, la multiplicidad muchas-a-nzuchus implica que una instancia de


una clase puede corresponder con muchas instancias de otra clase, y viceversa
Las clases Estudiante y Asignatura pueden estar relacionadas con asociaciones de multiplicidad muchas-a-muchas Un estudiante puede estar matriculado en muchas asignaturas, y en una asignatura determinada pueden estar matriculados muchos alumnos

Una asociacin una-a-una es la que mantienen objetos de la clase Persona y de


la clase Nmero de la Seguridad Social (NSS) Cada persona tiene un nico
nmero de la Seguridad Social y dado un nmero de la Seguridad Social se
corresponde con una nica persona Obsrvese la relacin bidireccional entre
objetos de estas dos clases

tiene
Nombre
Direccin

identifica

Figura 5 , 1 3 Asociacin una-a-una,

Las relaciones de multiplicidad o cardinalidad se indican de muy diversas


formas, segn sea la metodologa de anlisis y diseo orientada a objetos que se
utilice Las notaciones ms usuales son:

1 n , 1-m

+
0,1, 0-1

n , m-n

una-a-muchas

El rol (papel) representado en la lnea (una persona tiene-un NSS) se lee de


izquierda a derecha; sin embargo, la relacin inversa (un NSS identifica a una
persona) est tambin implicada y se lee de derecha a izquierda
Una asociacin una-a-muchas se ilustra en la Figura 5 14 entre una Persona y la Compaa (empresa) para la que trabaja, suponiendo que una persona
no est pluriempleada y s610 trabaja para una compaa

M
Nombre
Direccin

una-a-muchas

Nombre
Direccin

opcionalidad

Figura 5,,14. Asociacin una-a-muchas,,

opcionalidad

Una asociacin nzuchas-a-muchas entre la clase Ventas y los Productos


que se compran en cada operacin de venta

muchas-a-muchas

Ventas

muchas-a-muchas

una-a-una

Figura 5 12

Relaciones de cardinalidad (multiplicidad)

Figura 5,.15 Asociacin muchas-a-muchas


Las asociaciones se implementan mediante punteros o referencias a objetos
de las clases

150

Modelado de obietos: relaciones

151

Programacin orientada a objetos

5..5. HERENCIA: JERARQUIA DE CLASES


Una de las herramientas disponibles en lenguajes orientados a objetos ms
poderosos es la herencia Esta construccin permite modelar, del modo ms
preciso, la realidad que se desea emular en su programa, abstrayendo el comportamiento comn entre objetos similares a travs de un mecanismo de generalizacin Este mecanismo, como ya se ha comentado, proporciona un gran
detalle de descripcin, que comienza en clases globales y se va extendiendo a
travs de subclases especficas y especializadas
En otras palabras, la herencia permite crear muchas clases que son similares
entre s, sin tener que rescribir cada vez las partes que son similares; esta
propiedad permite combinar varias clases en una de ellas o modificar una clase
existente sin modificar realmente el cdigo original La herencia es el corazri de
la prograinacin orientada a objetos y constituye el bloque fundu~nentalde construccin pala reutilizai el cdigo El segundo bloque de construccin es el polimorfismo La herencia es una tcnica natural y til para organizar programas,
La herencia, en esencia, es una relacin entre clases, en donde una clase
comparte la estructura o comportamiento definida en una clase (herencia siinple) o varias clases (hereizcia mltiple)
La clase superior en la jerarqua se denomina superclase (clase base en
C++); las clases que heredan los miembros de la superclase (incluyendo funciones y datos) se denominan subclase (clase derivada en C + + ) Las clases derivadas pueden tambin modificar miembros de la clase base o aadir nuevos
miembros Este proceso puede continuar, de modo que una clase derivada
servir normalmente como una clase base, a partir de la cual se definen otras
clase derivadas Por consiguiente, se crean jerarquas de clases, en las que cada
clase puede servir como un padre o raz de un nuevo conjunto de clases La
Figura 5 16 representa un ejemplo de una jerarqua de clases

es-un
Polgono
es-un,

\aes-un
,
M
=

Elipse

-f es-un

Figura 5,,16. Relaciones entre clases (un tipo de, o e s un/una.l

L.a herencia es la propiedad que implementa una relacin de generalizacin/


especializacin (es-un; ir-a), en la que una snbclase hereda de una o ms superclases
La herencia significa que el comportamiento de los datos asociados con
las clases hijas son siempre una extensin (es decir, estrictamente hablando,
un conjunto ms grande) de las propiedades asociadas con las clases padres Una subclase debe tener todas las propiedades de la clase padre y
otras Por otro lado, dado que una clase hija es una forma ms especializada
de la clase padre, es tambin, en un cierto sentido, una contraccin del tipo
padre
La herencia significa que las subclases heredan la estructura y el comportamiento de sus superclases La mayora de los lenguajes de la programacin
orientados a objetos permiten que los mtodos de una superclase se puedan
heredar, as como excluir, y tambin se permite aadir y redefinir mtodos en
una subclase

La herencia se puede utilizar para ayudar a escribir cdigo reutilizable y


representar las relaciones entre tipos y subtipos (clases y subclases)
Existen dos tipos de herencia: heiencia sinzple y he~enciamltiple

5.5.1. Herencia simple


El caso ms siinple de herencia es la herencia simple, en la que una clase slo se
deriva de otra clase As, por ejemplo, en un caso tpico de zoologa,
un gato o un perro es un animal? y en un caso tpico de botnica, un clavel es
una flor Un gato posee determinadas caractersticas de la categora o clase
animal; por otra patte, un gato difiere en determinadas caractersticas de la
categora animal En nuestros ejemplos, <<Animalo Flor son las superclases
o clases bases, y Gato o Rosa son las subclases, clases derivadas o clases
extendidas o ampliadas
Otro ejemplo simple puede se1 la clase P r o f e s o r como un tipo de clase
derivado de Persona
La clase P r o f e s o r es un tipo de (es-un) Persona, al que aade sus propias
caracteristicas L.as clases se organizan en una estructura lgica denominada
jeraiquia de clases La Figura 5 18 muestra unajerarqua de clases que contiene
en su nivel ms alto la clase P e r s o n a y dos subclases o clases derivadas,
E s t u d i a n t e y P r o f e s o r Las subclases heredan caractersticas de sus superclases Las caractersticas pueden ser variables de instancias (campos miembro)
y/o mtodos (funciones miembro)

152

Modelado de objetos: relaciones

Programacin orientada a objetos

..

- ..

. .

: Profesor

. ..

*.. Persona ;
(d)

..

.......

Figura 5 19
Figura 5 1 7

Herencia simple: (a) notacin de Yourdon; lb) notacin genrica;


lc) notacin OMT; (d) notacin de Booch,,

Superclase o clase base

es-un 1

153

es-un

Jerarquia de clase Persona (herencia simple)

La herencia simple no puede expresar ~elacionesmltiples, por ejemplo


aquellas personas que sean a la vez empleados y estudiantes En realidad,
existen numerosos ejemplos en la vida diaria de relaciones de herencia mltiple:
un F a b r i c a n t e de m o t o c i c l e t a s japonesas tiene propiedades (variables
instancia y mtodos) que pertenecen a Compaa laponesa y a F a b r i c a n t e
de m o t o c i c l e t a s ; una ventana VentanaTextoBordeada permite editar
texto en una ventana con bordes que hereda de VentanaTexto y de v e n t a naConBordes; por ltimo, Robocop acta tanto de r o b o t como de p o l i c a

es-un
Subclase o
clase derivada

Figura 5 18. Jerarquia de clases: Persona, Profesor

v Estudiante

5.5.2. Herencia mltiple


Hasta este momento s610 se ha utilizado la herencia simple: cada subclase o
clase derivada tiene una y s61o una supe~claseo clase base Supongamos una
jerarqua de clases Persona, donde s610 existen relaciones de herencia simple

( Robocop )
Figura 5.20

Jerarquia de herencia mltiple

154

Programacin orientada a objetos

Modelado de objetos: relaciones

El mecanismo que permite a una clase heredar de ms de una clase se llama


hel.encia mltiple; se dice entonces que una clase es una extensin de dos o ms
clases Con herencia mltiple se pueden combinar diferentes clases existentes
para producir combinaciones de clases que utilizan cada una de sus mltiples
superclases La representacin gifica en este caso se suele hacer con un grafo
dirigido no simtrico, ya que una clase puede tener ms de una predecesora
inmediata
La Figura 5 21 proporciona un ejemplo de la jerarqua de clase Persona
utilizando herencia mltiple Como en ella se ilustra, el Gerenteventas hereda
de Gerente y Vendedor; de modo similar, EstudianteTrabajador hereda
de Estudiante; DirectorDeProyectos hereda de ~ e r e n t ey de Ingeniero;por ltimo, SecretarioTcnico hereda de Secretario y de Ingeniero,

Estudiante

%e\

trabajador

general

[p]

Figura 5 2 1 Jerarqua de clases P e r s o n a con herencia rnultiple,

Comida
Precio
Calorias

Fertilizar

Comprar
Comer
Guisar

li
Patata

Pelar
Cortar

Figura 5 22

Jerarqua de clases P a t a t a con herencia multiple

155

Otro ejemplo de herencia mltiple se puede ver en la Figura 5 22, en donde


Comida y Planta son dos clases que actan como superclases de Patata,que

es un alimento y a la vez una planta


La herencia mltiple es una herramienta muy potente, pero es fcil abusar
de ella y caer en graves errores; por el contrario, utilizada con precaucin, es
una ayuda valiossima en el desarrollo orientado a objetos De cualquier forma,
la herencia mltiple ha sido y sigue siendo tema de debate entre expertos de
programacin y de lenguajes orientados a objetos,
5.,5,.2,,1.Ventajas de la herencia multiple

La herencia mltiple es til en muchas situaciones Puede ayudar, fundamentalmente, a modelar objetos en su dominio del problema Una aplicacin muy
frecuente de la herencia mltiple se suele dar cuando se crea una nueva clase a
partir del comportamiento de dos o ms clases, incluso aun cuando fueran
desarrolladas independientemente unas de otras Un uso muy comn es aadir
persistencia6 a los objetos,
Otra ventaja apreciable es su alto grado de flexibilidad, simplicidad y elegancia en la definicin de nuevas clases que se crean a partir de clases existentes
La herencia mltiple favorece claramente la reutilizacin, por la razn importante que permite ms libertad en la definicin de nuevas clases a partir de
las existentes Esta construcciii permite crear jerarquas de clases completas
ms fcilmente, sin restringir las relaciones en las jerarquas de clases o casos
singulares. En este sentido, la herencia mltiple favorece un enfoque ms flexible para el diseo de aplicaciones
Adeins, la herencia mltiple facilita el cambio de la implementacin de una
clase, mientras deja inalterado su interfaz. De hecho, puede cambiar simplemente la parte de una clase que corresponda a una de sus clases base, heredando de una clase base diferente que realiza las mismas hncionalidades en diferentes formas, obteniendo, en consecuencia, una implementacin diferente de la
misma abstraccin
Sin embargo, hemos de reconocer que el uso generalizado de plantillas
templat te^) ha reducido significativamente las ventajas de la herencia mltiple
5,.5.,2..2 Inconvenientes de la herencia multiple

Existen problemas asociados al uso de la herencia mltiple Con frecuencia


se produce confusin y comportamiento impredecible, debido al uso de la
"os
objetos persistentes - e n contraposicin a los objetos transitorios- son aquellos que
permanecen activos entre ejecuciones El tiempo de vida de un objeto es la duracin de la ejecucin
del programa; una vez que el programa termina su ejecucin, todos los objetos que estaban activos
se vuelven inaccesibles Los objetos persistentes son aquellos que al almacenarse en disco permdnecen intactos entre ejecuciones La perrirrencia o mejor el soporte de objetos persistentes es fundamental en los sistemas de gestin o administracin de bases de datos orientadas a objetos Para
ampliar conceptos sobre objetos persistentes se puede estudiar a Booch, Rbosafian y Abnous,
Graham y Mary Loomies, entre otros

156

Modelado de objetos: relaciones

Programacin orientada a objetos

herencia a partir de clases con mtodos que tienen los mismos nombres pero
significados diferentes; es decir, se produce ambigedad Todo lenguaje que
soporte herencia mltiple ha de tener reglas propias para resolver esta ambigedad Otro inconveniente de la herencia mltiple es el aumento de tiempo
auxiliar que se aade a los programas.
La herencia mltiple est soportada por C + + , CLOS y Objective-C Sin
embargo, Object-Pascal, Turbo Pascal 5.51617 y Smalltalk no soportan esta
propiedad, aunque algunas versiones de Smalltalk tambin permiten esta caracterstica
5 5 . , 2 . , 3 Diseo de clases con herencia multiple

El diseo de una estructura de clases adecuada que implica herencia, especialmente herencia mltiple, es una tarea difcil Suele ser un proceso interactivo e incremental Dos problemas se suelen presentar cuando se manipula
herencia mltiple: jcmo resolver las colisiones de nombre de diferentes superclases? Y cmo manipular herencia repetida o herencia de ascendientes
comunes?
Las colisiones de nombres se producen cuando dos o ms superclases dif'erentes tienen el mismo nombre para algn elemento de sus interfaces, tales
como variables instancia y mtodos Y la herencia repetida se produce cuando
una clase es ascendiente de otra clase por ms de un camino Supongamos que
las clases empleado y estudiante tienen las estructuras de variables instancias que se muestran en la Figura 5 23
Estudiante

Direccin
Salario

157

La clase EstudianteTrabajador hereda de Empleado y Estudiante


Una variable instancia de Estudiante puede contener las variables {Nombre, Edad, Direccin, Carrera, Curso, Grupo, Turno) yunavariable
instancia de Empleado contendr las variables {Nombre, Edad, Direccin, Salario, Categora, Departamento)

Booch considera que existen bsicamente tres mtodos para resolver las
colisiones o choque de nombres:

L.a semntica del lenguaje puede considerar una colisin de nombres


como ilegal y rechaza la compilacin de la clase. Este es el mtodo
utilizado por Smalltalk y Eiffel Sin embargo, en Eiffel es posible renombrar elementos de modo que no exista ambigedad
2 La semntica del lenguaje puede considerar el mismo nombre introducido por clases diferentes con referencia al mismo elemento conflictivo
Es el mtodo de CLOS
3 La semntica del lenguaje puede permitir el choque o conflicto, pero
requiere que todas las referencias de nombres califiquen la fuente de su
declaracin Es el mtodo utilizado por C + +

5.6. HERENCIA REPETIDA


El otro problema grave que se produce en el uso de la herencia mltiple es la
herencia repetida Este tipo de herencia se produce cuando una clase hereda de
dos o ms superclases que a su vez heredan de la misma superclase Esta
situacin se presenta, por ejemplo, en el caso de la Figura 5 24, en la que
EstudianteTrabajador es una subclase de Empleado y Estudiante, que
a su vez son subclases de Persona Suponiendo que Per cona tiene los atributos Nombre, Edad, Direccin que se reciben por herencia de EstudianteTrabalador En este caso, los atributos anteriores se repetirn en la ltima
subclase

Categora

Atributos: Nombr e

Edad

Estudiante
trabajador

Colisin

(se heredan Nombre,Edad y Direccin


de las dos dases)

Figura 5 2 3 Colisin de nombres de atributos

Figura 5.24, Herencia repetida

La mayora de los lenguajes de programacin no permiten la duplicacin


esttica de la superclase, pero eso no se producir siempre, y as se puede dar el
caso de que el compilador duplique la clase que se hereda dos o ms veces En

158

Programacin orientada a objetos

la Figura 5 25 se muestran grafos de herencia repetida, con lo que se crea una


copia o dos copias (instancias), segn el caso

Modelado de objetos: relaciones

159

Por el contrario, si consideramos una clase que describa a una pareja o


matrimonio que se derive de dos clases, Hombre y Mujer, respectivamente, la
clase P e r s o n a debe estar presente dos veces, ya que el matrimonio lo constituyen dos personas y no una La Figura 5 27 muestra otro ejemplo de herencia
repetida,

Figura 5 25 Grafos de herencia repetida: (a) creacin de dos copias


de la superclase; (b) creacin de una sola copia de la superclase
Estas dos clases diferentes de herencia repetida corresponden a dos significados muy diferentes de esta construccin, como se ilust~aen los ejemplos
siguientes
El primer ejemplo es una clase que describe una P e r s o n a (con atributos de
datos de la persona y otra informacin) Se crean dos nuevas clases a partir de
la clase P e r s o n a por herencia: la clase P r o f e s o r de universidad (se aaden
datos adicionales relativos a la universidad donde imparte docencia, asignaturas y cursos a su cargo); la otra clase que se crea por herencia es Autor de
libros (con algunos nuevos atributos, tales como ttulos de libros publicados,
aos de publicacin y editoriales) En esta situacin se pueden considerar profesores que son autores de libros, y cuya estructura jerrquica se muestra en la
Figura 5 2 6 En este caso es ms correcto utilizar el caso de la herencia mltiple
de la Figura 525b, ya que un Pro e s o r A u t o r es slo una persona (iy no dos!),
y en consecuencia sus datos privados se han de duplicar

Figura 5.,26. Grafo de herencia repetida (dos copias de la superclase)


El grafo de la Figura 5 28 muestra cmo la clase D tiene dos copias, instancias o subobjetos de la clase A: una copia A de W y otra copia -llamada virtual
en C++- compartida por B y C

Figura 5,,28. Otro caso de herencia repetida,


Existen tres mtodos para tratar el problema de la herencia iepetida:

1
ProfesorAutor
u
Figura 526., Grafo de herencia repetida (una copia de la superclase)

Tratar la ocurrencia de herencia repetida como ilegal Este es el enfoque


de Smalltalk y Eiffel (aunque Eiffel tambikn permite el cambio de nombre para evitar las ambigedades)
Se permite la duplicacin de supeiclases, pero requiere el uso de nombres cualificados totalmente para referirse a los miembros de una copia
especifica Este es el mtodo empleado por C + +

160

Modelado de objetos. relaciones

Programacin orientada a objetos

5.2. Se dispone de la clase obj-geom:

Los modelos de objetos describen la estructura de datos esttica de los objetos,


clases y sus relaciones entre s Una clase de objetos describe un grupo de
objetos con atributos, operaciones y semntica comunes Un atributo es una
propiedad de los objetos de una clase; una operacin es una accin que se
puede aplicar a objetos de una clase
Las relaciones entre clases pueden ser: generalizacin/especializaci6n, agregacin y asociacin
L,as asociaciones establecen relaciones entre objetos y clases Un enlace
conecta dos o ms objetos La multiplicidad especifica cuntas instancias de
una clase se pueden relacionar con cada instancia de otra clase,
Una agregacin es una relacin en la que un objeto de una clase se compone
de una serie de objetos de diferentes clases; as, un motor de un coche (carro) se
compone de bujas, vlvulas, cilindros, etc,
El trmino generalizacin es til para construir modelos conceptuales de
datos e implementacin Durante el modelo conceptual, la generalizacin permite al desarrollador organizar clases en una estructura jerrquica basada en
sus semejanzas y diferencias Durante la implementacin, la herencia facilita la
reutilizacin de cdigo El trmino generalizacin se refiere a las relaciones
entre clases; el trmino herencia se refiere al mecanismo de obtener atributos y
operaciones utilizando la estructura de generalizacin La generalizacin proporciona los medios para redefinir una superclase en una o ms subclases La
superclase contiene caractersticas comunes a todas las clases; las subclases
contienen caractersticas especficas de cada clase La herencia puede prodncirse a travs de un nmero arbitrario de niveles, en donde cada nivel representa
un aspecto de un objeto
La herencia entre clases puede ser simple y mltiple

EJERCICIOS
5.1.

Esta clase tiene el inconveniente de no detectar desbordamientos positivos o negativos de la pila En cousecuencia, se decide disear una nueva
clase PilaDer derivada de Pila, con las mismas funciones miembro
meter y s a c a r , pero que adviertan al usuaiio con mensajes de Pila
vaca o <<Pilallena cuando se intente sacar un elemento de una pila
vaca o meter un elemento en una pila llena Escribir programa que
gestione la pila con ambas clases

Se puede tratar referencias a la misma clase como si fueran la misma


clase Este es el mtodo empleado por C + + cuando se introducen superclases repetidas como clases base virtual Una clase base virtual existe
cuando una subclase nombra a otra clase como su superclase y marca la
superclase como virtual, para indicar que es una clase compartida

RESUMEN

161

c l a s s objgeom (
protected:
f l o a t x c . vc:
- .
public:
o b j q e o m ( f 1 0 a t x = O , f i o a t y =O) { xc = x ; y~ = y ; j
void vercentro O i cout << xC cc " " << yC << end; 1
);

Disear clases c i r c u l o y cuadrado derivadas del obj-geom que


permitan calcular sus reas Una vez diseadas todas las clases, escribir
un programa que cree un objeto de cada clase, visualice los centros de
cada figura y a continuacin calcule y visualice las reas de cada figura
5.3. Una editorial de libros y discos desea crear fichas que almacenen el ttulo
y el precio (de tipo f l o a t ) de cada publicacin, Crear la correspondiente
clase (denominada Publicacin) que implemente los datos anteriores
A partir de esta clase, disear dos clases derivadas: Libro, con el nmero
de pginas (tipo i n t ) , ao de publicacin (tipo i n t ) y precio (tipo
f l o a t ) ; y d i s c o , con duracin en minutos (tipo f l o a t ) y precio (tipo
i n t ) Cada una de las tres clases tendr una funcin y otra funcin
mostrar ( ) , para visualizar sus datos
Escribir un programa que cree instancias de las clases Libro y d i s co, solicite datos del usuario y a continuacin los visualice
5.4.

Se dispone de la clase p u b l i c a c i n del ejercicio 5 3 y se desea crear una


nueva clase base llamada v e n t a s que contenga un array con las ventas
del ltimo semestre de una determinada publicacin. Esta clase debe
tener funciones miembros L e e r ( ) y mostrar ( ) que obtenga y visualice
las citadas ventas Modificar las clases L i b r o y d i s c o , lea y visualice las
publicaciones

Crear una clase P i l a con la siguiente estructura:

miembros dato
(creacin protegida)

array de enteros
cima de tipo entero

funciones miembro:

meter datos en la pila

s a c a r datos en la pila

pila
cima

5.5. El departamento de informtica de un hospital est realizando un nuevo


registro de datos del personal, pacientes y proveedores del hospital y
desea realizar la jerarqua de clases siguientes:
Escribir las clases correspondientes de acuerdo a las siguientes estructuras:

162

Modelado de objetos relaciones


Prograrnac,on orientada a objetos

Persona

Pacieizte

Empleado

nombre
direccin
ciudad
Leer ( )
visualizar(

nombre
direccin
ciudad
cdigo-diagnstico
telfono
fecha denacimiento
Leer ( )
visualizar ( )
enviar- factura

nombre
direccin
ciudad
cdigoempleado
horas -extras
compaade seguros
Leer ( )
visualizar ( )
enviar-salario

provee do^

Plarztilla

Everzlual

nombre
direccin
ciudad
cdigovendedor
saldo
fax
telfono
descuentos
Leer ( )
visualizar
pagar-factura ( )

datos de empleado
salario sumal
aos deantiguedad
pagarsalario

datos de empleado
honorarios/hora
pagar-salario ( )

5.6. Disear una clase nombre que contenga ties miembros datos (nombre,
primer apellido y segundo apellido), un constructor y dos funciones
miembro Leernombre i que obtiene valores para los miembros dato
de la clase mostrar ( ) que ofrece la visualizacin del nombre complemento Disear otra clase derivada direccin que toine la informacin
de nombre y aada calle, ciudad, provincia y cdigo postal Esta clase
debe tener acceso a las funciones pblicas de la clase base y tres funciones
miembro nueva-direccin, nuevo-nombre i ) y mostrar ( ) . Escribir un programa que cree un objeto de direccin,lea datos y visualice

la informacin
57. Disear una jerarqua de clases: Crculo, Cilindro y CilindroHueco En esencia, se puede decir que un objeto cilindro es un objeto crculo
con una altura, y un cilindro hueco es un cilindro con un espacio hueco
dentro de l La clase Crculo debe tener un dato Radio (tipo double)
y unas funciones miembro LeerRadio, Area y Circunferencia,que
obtienen el valor del radio y calculan el rea del circulo y la longitud de la
circunferencia Escribir un programa que permita crear objetos Crculo, Cilindro y CilindroHueco y calcule la longitud de la circunferencia y las reas del crculo, del cilindro y del cilindro hueco

Frmulas

Crculo

Longitud
Area

2 n
n j2

Cilindro

Area
Volumen

2 n 1 h+2 n
n r2 h

Cilindro hueco

Longitud

2 n (r2 i2iizteino) + 2 n
+ 2 n Ii interno
n ( r Z r2inteino) h

Volumen

1'

163

También podría gustarte