Documentos de Académico
Documentos de Profesional
Documentos de Cultura
programacin orientada a
objetos
Contenido
Descripcin general
Clases y objetos
1
2
Uso de la encapsulacin
10
23
36
Descripcin general
Objetivo del tema
Explicacin previa
Clases y objetos
Uso de la encapsulacin
Clases y objetos
Objetivo del tema
Explicacin previa
Qu es una clase?
Qu es un objeto?
Abstraccin
Qu es una clase?
Objetivo del tema
Explicar el concepto de
clase.
Explicacin previa
COCHE?
COCHE?
Para el filsofo
z
El nico requisito real que debe cumplir una clase es estimular la comunicacin.
Qu es un objeto?
Objetivo del tema
Explicacin previa
A menudo se comete el
error de usar los trminos
clase y objeto como si
significaran lo mismo,
cuando en realidad son dos
conceptos muy diferentes.
Recomendacin al
profesor
Identidad
La identidad es la caracterstica que distingue un objeto de todos los dems
objetos de la misma clase. Por ejemplo, imaginemos que dos vecinos tienen
coches que son exactamente de la misma marca, modelo y color. A pesar de lo
mucho que se puedan parecer, podemos estar seguros de que sus matrculas
sern diferentes y reflejarn la identidad de cada uno de los coches. La ley dice
que es necesario poder distinguir un objeto coche de otro. (Cmo les ira a los
seguros de automviles si los coches no tuvieran identidad?)
Comportamiento
El comportamiento es la caracterstica que hace que los objetos sean tiles. Los
objetos existen para que se comporten de una cierta manera. La mayor parte del
tiempo podemos olvidarnos de cmo funciona un coche y pensar slo en su
comportamiento externo o de alto nivel. Los coches nos son tiles porque
podemos conducirlos; tienen un mecanismo interno, pero nos resulta casi
inaccesible. Lo que s es accesible es el comportamiento del objeto, que es
adems el factor determinante para su clasificacin. Los objetos de una misma
clase comparten un comportamiento comn: Un coche es un coche porque
podemos conducirlo, un bolgrafo es un bolgrafo porque podemos usarlo para
escribir.
Estado
El estado se refiere a los mecanismos internos de un objeto que hacen que se
comporte de una determinada manera. Un objeto bien diseado mantiene su
estado inaccesible. Esto guarda una relacin muy estrecha con los conceptos de
abstraccin y encapsulacin. No nos preocupa por qu un objeto hace lo que
hace, slo queremos que lo haga. Es posible que dos objetos tengan el mismo
estado, pero siguen siendo dos objetos diferentes; por ejemplo, dos gemelos
idnticos tienen exactamente el mismo estado (su ADN), pero son dos personas
distintas.
Explicacin previa
Recomendacin al
profesor
struct
struct Time
Time
{{
public
public int
int hour;
hour;
public
int
public int minute;
minute;
}}
class
class BankAccount
BankAccount
{{
...
...
...
...
}}
Estructuras
Una estructura, como Reloj en el ejemplo, no tiene identidad. Si dos variables
Reloj representan las 12:30, el programa se comportar exactamente de la
misma manera independientemente de cul de ellas utilicemos. Las entidades de
software sin identidad se llaman valores. Los tipos predefinidos descritos en el
Mdulo 3, Uso de variables de tipo valor, en el Curso 2124C, Programacin
en C#, como int, bool, decimal y todos los tipos struct, se llaman en C# tipos
de valor.
Las variables del tipo struct pueden contener mtodos, aunque es preferible que
no lo hagan. Idealmente, deben contener slo datos. Por otra parte, no hay
ningn problema en definir operadores en estructuras. Los operadores son un
tipo de mtodos que no aaden nada al comportamiento, sino slo una sintaxis
ms concisa para un mismo comportamiento.
Clases
Una clase, como CuentaBancaria en el ejemplo, tiene identidad. Si hay dos
objetos CuentaBancaria, el programa se comportar de distinta forma
dependiendo de cul se utilice. Las entidades de software con identidad se
llaman objetos (en ocasiones, las variables del tipo struct reciben tambin el
nombre de objetos, pero estrictamente hablando son valores). Los tipos
representados por clases se llaman en C# tipos de referencia. A diferencia de
las estructuras, en una clase bien diseada no se debe ver nada que no sea un
mtodo. Estos mtodos aaden comportamiento de alto nivel al
comportamiento primitivo que existe a nivel de los datos inaccesibles.
10
Abstraccin
Objetivo del tema
Definir la abstraccin.
Explicacin previa
Decidir qu es importante y qu no lo es
El
El objetivo
objetivo de
de la
la abstraccin
abstraccin es
es no
no perderse
perderse en
en vaguedades
vaguedades yy crear
crear
un
un nuevo
nuevo nivel
nivel semntico
semntico en
en el
el que
que se
se pueda
pueda ser
ser absolutamente
absolutamente preciso.
preciso.
Edsger
Edsger Dijkstra
Dijkstra
Recomendacin al
profesor
Los contenidos de la
transparencia tienen
implicaciones importantes.
Lo primero que se dice es
que hay que decidir qu es
importante y qu no lo es.
En otras palabras, hay que
tomar decisiones de diseo.
Dado el nivel de este curso,
dedique poco o ningn
tiempo a discutir este tema.
Concntrese ms bien en la
dependencia, que guarda
una relacin muy estrecha
con la idea de cambio (que
se discute a continuacin).
Dependencia mnima
Las mejores abstracciones de software hacen que las cosas ms complejas
parezcan sencillas. Para ello ocultan todos los aspectos de una clase que no son
esenciales. Una vez ocultos, estos aspectos ya no pueden ser vistos ni utilizados
y no se depende de ellos de ninguna manera.
Este principio de dependencia mnima es lo que hace que la abstraccin sea tan
importante. Una de las pocas cosas seguras en el desarrollo de software es que
siempre es necesario cambiar el cdigo. La comprensin perfecta slo se
alcanza (si es que se consigue) al final del proceso de desarrollo; las primeras
decisiones se toman a partir de una comprensin incompleta del problema, por
lo que siempre hay que reconsiderarlas ms tarde. Las especificaciones tambin
cambian a medida que se va entendiendo mejor el problema. Las versiones
posteriores incluyen cada vez ms funciones. Los cambios son normales en el
desarrollo de software; lo ms que podemos hacer cuando se producen es
minimizar sus efectos, y cuanto menos dependamos de una cosa, menos nos
afectarn sus cambios.
11
Citas ilustrativas
He aqu algunas citas para ilustrar el principio de dependencia mnima que hace
que la abstraccin sea tan importante:
Para su informacin
Uso de la encapsulacin
Objetivo del tema
Explicacin previa
Qu es la encapsulacin?
Cmo se puede emplear la
encapsulacin en una clase,
y por qu?
Por qu se encapsula?
Datos de objetos
12
13
Explicacin previa
Despus de decidir qu
partes pueden ser de
acceso pblico y cules
deben quedar ocultas, es
preciso contar con una
forma sencilla de ocultar la
complejidad interna de una
clase.
Retirar( )
Retirar( )
saldo
saldo
Ingresar( )
CuentaBancaria ?
Ingresar( )
CuentaBancaria ?
La transparencia termina
recomendando el uso de la
encapsulacin para forzar la
abstraccin.
sta es la primera de dos
transparencias sobre
encapsulacin. La segunda
transparencia proporciona
informacin adicional. En
esta transparencia se hace
hincapi en la palabra
cpsula porque de ella se
deriva la palabra
encapsulacin.
Observe que la figura de la
izquierda lleva un signo de
interrogacin. Esto se debe
a que no existe ningn
elemento individual e
independiente que
represente la cuenta
bancaria.
Programacin procedural
Los programas procedurales tradicionales, escritos en lenguajes como C,
contienen fundamentalmente una gran cantidad de datos y muchas funciones, y
cada funcin puede acceder a todos los datos. Este mtodo con un nivel tan alto
de asociacin puede funcionar bien en un programa pequeo, pero se hace cada
vez menos conveniente a medida que crece el programa. Un cambio en la
representacin de los datos puede resultar catico, ya que har que fallen todas
las funciones que usan los datos modificados (y que por tanto dependen de
ellos). Los cambios son ms complicados a medida que el programa se hace
ms grande y, por tanto, ms frgil y menos estable. La separacin de datos y
funciones no se mantiene al cambiar la escala del programa. Esto dificulta los
cambios y, como saben todos los desarrolladores de software, el cambio es la
nica constante.
La separacin de datos y funciones plantea otro serio problema. En trminos de
abstraccin de comportamientos a alto nivel, esta tcnica no corresponde a la
forma de pensar de los humanos. Puesto que los programas estn escritos por
personas, es mucho mejor utilizar un modelo de programacin que se aproxime
a la forma en que las personas piensan y no a la forma en que estn fabricados
los sistemas informticos.
14
15
Explicacin previa
Despus de decidir qu
partes van a quedar ocultas
del mundo exterior, cmo
podemos asegurarnos de
que nadie podr ver cmo
funcionan las clases?
Retirar( )
saldo
Ingresar( )
CuentaBancaria ?
Recomendacin al
profesor
Retirar( )
saldo
Ingresar( )
CuentaBancaria ?
16
17
Por qu se encapsula?
Objetivo del tema
Explicacin previa
Con qu frecuencia
cambian los detalles
internos de una clase? Es
posible cambiar la forma de
almacenamiento o
procesamiento de la
informacin?
Retirar( )
Ingresar( )
saldo 12,56
Retirar( )
Ingresar( )
euros 12
cntimos
Recomendacin al
profesor
56
18
Datos de objetos
Objetivo del tema
Discutir aspectos
relacionados con datos de
objetos privados.
Explicacin previa
Retirar( )
Retirar( )
Ingresar( )
Ingresar( )
saldo 12,56
saldo
12,56
prop. Juan"
prop.
Pedro"
19
Explicacin previa
Ocasionalmente es
necesario que objetos de la
misma clase compartan
datos.
Retirar( )
Ingresar( )
Ingresar( )
saldo 12,56
inters 7%
saldo
99,12
inters 7%
El inters se muestra en la
transparencia como dato de
objeto. La "X" roja indica
que no es una buena idea.
El segundo ejercicio de la
prctica pide a los
estudiantes que creen datos
y mtodos estticos.
Es una forma poco eficaz de resolver el problema tal como est planteado:
Todas las cuentas bancarias comparten el mismo inters.
Aumenta innecesariamente el tamao de cada objeto, utilizando ms
memoria cuando se ejecuta el programa y ms espacio en disco cada vez
que se guarda.
Hace difcil cambiar el inters, ya que habra que modificarlo en todos y
cada uno de los objetos cuenta y eso podra hacer imposible acceder a las
cuentas durante el cambio.
Aumenta el tamao de la clase. El dato privado de inters necesitara
mtodos pblicos, por lo que la clase cuenta se hara menos compacta y no
funcionara todo lo bien que debiera.
Para resolver este problema no se debe compartir a nivel de objeto informacin
que sea comn a varios objetos. En lugar de describir el inters muchas veces a
nivel de objeto, es mucho mejor describirlo una sola vez a nivel de clase. El
inters definido a nivel de clase se convierte en la prctica en un dato global.
Pero los datos globales, por definicin, no se almacenan dentro de una clase, y
por lo tanto no pueden ser encapsulados. A causa de esto, muchos lenguajes de
programacin orientados a objetos (incluyendo C#) no permiten los datos
globales. En su lugar permiten describir datos como estticos.
20
21
Explicacin previa
Si el inters pertenece a la
clase cuenta en lugar de a
un objeto cuenta concreto, y
si se utiliza encapsulacin
para ocultar la
representacin interna del
inters, cmo se puede
acceder al inters o
modificarlo?
La clase cuenta
Inters( )
9
inters 7%
Las clases contienen datos
y mtodos estticos
Un objeto cuenta
8
8
Retirar( )
Ingresar( )
saldo
99,12
prop.
Pedro"
22
Los mtodos estticos siguen teniendo acceso a todos los miembros privados de
una clase y pueden acceder a datos privados no estticos por medio de una
referencia a objeto. El siguiente cdigo muestra un ejemplo:
class Reloj
{
...
public static void Reset(Reloj t)
{
t.hora = 0;
// Okay
t.minuto = 0; // Okay
hora = 0;
// error al compilar
minuto = 0;
// error al compilar
}
private int hora, minuto;
}
23
Explicacin previa
24
Explicacin previa
Un programa C# es una
clase que tiene un mtodo
esttico llamado Main. Por
qu?
using
using System;
System;
class
class Hello
Hello
{{
public
public static
static int
int Main(
Main( ))
{{
Console.WriteLine(Hello,
Console.WriteLine(Hello, World);
World);
return
return 0;
0;
}}
}}
25
Si, por el contrario, existen varios mtodos llamados Main, es necesario que
uno de ellos est designado explcitamente como punto de entrada al programa
(y que ese Main tambin sea pblico explcitamente). El siguiente cdigo
muestra un ejemplo:
// DosEntradas.cs
using System;
class EntradaUno
{
public static void Main( )
{
Console.Write("EntradaUno.Main( )");
}
}
class EntradaDos
{
public static void Main( )
{
Console.Write("EntradaDos.Main( )");
}
}
// Fin del archivo
c:\> csc /main:EntradaUno DosEntradas.cs
c:\> dosentradas.exe
EntradaUno.Main( )
c:\> csc /main:EntradaDos DosEntradas.cs
c:\> dosentradas.exe
EntradaDos.Main( )
c:\>
26
}
En otras palabras, en la prctica el runtime tendra que ejecutar el siguiente
cdigo:
Ejemplo ejecuta = new Example( );
ejecuta.Main( );
27
Explicacin previa
class
class BankAccount
BankAccount
Mtodos
Mtodos pblicos
pblicos
{{
describen
describen un
un
public
void
Withdraw(decimal
cantidad)
public void Withdraw(decimal cantidad) comportamiento
comportamiento
{{ ...
accesible
accesible
... }}
public
public void
void Deposit(decimal
Deposit(decimal cantidad)
cantidad)
Campos
{{ ...
Campos privados
privados
... }}
describen
describen un
un
private
decimal
balance;
private decimal balance;
estado
estado
private
string
name;
private string name;
inaccesible
inaccesible
}}
28
29
30
Explicacin previa
class
class Program
Program
ahora hora
{{
minuto
static
static void
void Main(
Main( ))
nuevo
suya
{{
... objeto
... CuentaBancaria
Reloj
Reloj ahora;
ahora;
ahora.hora
ahora.hora == 11;
11;
Cuenta
Cuenta Bancaria
Bancaria suya
suya == new
new CuentaBancaria(
CuentaBancaria( );
);
suya.Ingresar(999999M);
suya.Ingresar(999999M);
}}
}}
Recomendacin al
profesor
El primer ejercicio de la
prctica hace hincapi en la
diferencia entre estructuras
y clases y utiliza el operador
new para crear objetos.
struct Reloj
{
public int hora, minuto;
}
class Programa
{
static void Main( )
{
Reloj ahora;
ahora.hora = 11;
ahora.minuto = 59;
...
}
}
Las variables del tipo struct son tipos de valor. Esto quiere decir que, cuando se
declara una variable de estructura (como ahora en Main), se crea un valor en la
pila. En este caso, la estructura Reloj contiene dos ints, por lo que la declaracin
de ahora crea dos ints en la pila, una llamada ahora.hora y otra ahora.minuto.
Estos dos ints NO se inicializan a cero por defecto. Por eso no es posible leer el
valor de ahora.hora ni de ahora.minuto hasta que se les asigna un valor. Los
valores slo tienen validez en el bloque en el que se declaran. En este ejemplo,
el mbito de ahora es Main. Esto significa que cuando el flujo de control
abandona Main (por un return normal o porque se ha lanzado una excepcin),
ahora quedar fuera de mbito y dejar de existir.
31
Para corregir este error es necesario crear un objeto Reloj (usando la palabra
reservada new) y hacer que la variable de referencia ahora apunte al objeto
recin creado, como en el siguiente cdigo:
class Programa
{
static void Main( )
{
Reloj ahora = new Reloj( );
ahora.hora = 11;
ahora.minuto = 59;
...
}
}
32
33
Explicacin previa
class
class CuentaBancaria
CuentaBancaria
{{
...
...
public
public void
void PoneNombre(string
PoneNombre(string nombre)
nombre)
Si esta instruccin fuera
{{
nombre = nombre;
this.nombre
this.nombre == nombre;
nombre;
qu ocurrira?
}}
private
private string
string nombre;
nombre;
}}
La palabra reservada this apunta implcitamente al objeto que est haciendo una
llamada a un mtodo de objeto.
En el siguiente cdigo, la instruccin nombre = nombre no tendra ningn
efecto, ya que el identificador nombre en el lado izquierdo de la asignacin no
se corresponde al campo privado de CuentaBancaria llamado nombre. Los dos
identificadores se refieren al parmetro del mtodo, que tambin se llama
nombre.
class CuentaBancaria
{
public void PoneNombre(string nombre)
{
nombre = nombre;
}
private string nombre;
}
34
35
36
Explicacin previa
Herencia
Jerarquas de clases
Polimorfismo
Interfaces
37
Herencia
Objetivo del tema
Explicar el concepto de
herencia.
Explicacin previa
Recomendacin al
profesor
La transparencia incluye
una figura de un hombre,
una mujer y una nia
pequea en un triciclo.
Utilice esta figura como
ejemplo de cmo no usar la
herencia, tal como se
explica en las notas.
Generalizacin
Msico
Msico
Especializacin
Violinista
Violinista
Clase base
Clase derivada
Es ste un buen
ejemplo de
herencia ?
38
39
Jerarquas de clases
Objetivo del tema
Explicacin previa
Msico
Msico de
de
cuerda
cuerda
???
???
Violinista
Violinista
toca
Instrumento
Instrumento
musical
musical
toca
Instrumento
Instrumento de
de
cuerda
cuerda
toca
Violn
Violn
???
???
Las clases que derivan de clases base pueden a su vez convertirse en clases base
para otras clases. En la transparencia, por ejemplo, la clase MsicoDeCuerda
deriva de la clase Msico, pero a su vez en una clase base para la clase derivada
Violinista. Un grupo de clases con relaciones de herencia forma una estructura
conocida como jerarqua de clases. Estas clases representan conceptos ms
generales (generalizacin) a medida que ascendemos en la jerarqua, y ms
especializados (especializacin) a medida que nos movemos hacia abajo.
La profundidad de una jerarqua de clases es el nmero de niveles de herencia
que hay en la jerarqua. Las jerarquas de clases ms profundas son ms
difciles de usar que las jerarquas de clases poco profundas. La mayor parte de
las normas de programacin recomiendan limitar la profundidad a entre cinco y
siete clases.
La transparencia muestra dos jerarquas de clases paralelas, una para msicos y
otra para instrumentos musicales. Crear jerarquas de clases no es fcil, ya que
las clases se tienen que disear como clases base desde el principio. Las
jerarquas de herencia son tambin la caracterstica principal de los marcos de
trabajo o frameworks, que son modelos ampliables sobre los que se crean
entidades ms complejas.
40
Comparar la herencia
sencilla y la herencia
mltiple.
Explicacin previa
En teora, el
comportamiento de una
clase puede derivar de ms
de un antecesor.
Instrumento
Instrumento
musical
musical
Con
Con teclas
teclas
Violn
Violn
Instrumento
Instrumento de
de
cuerda
cuerda
La herencia se denomina sencilla cuando una clase tiene una sola clase base
directa. En el ejemplo de la transparencia, la clase Violn hereda de una clase,
InstrumentoDeCuerda, y es un ejemplo de herencia sencilla.
InstrumentoDeCuerda deriva de dos clases, pero esto no afecta a la clase
Violn. La herencia sencilla tambin puede ser difcil de utilizar. Es bien
conocido que la herencia es una de las herramientas ms potentes de modelado
de software, pero al mismo tiempo una de las peor entendidas y empleadas.
Recomendacin al
profesor
41
Polimorfismo
Objetivo del tema
Explicar el concepto de
polimorfismo.
Explicacin previa
Un
Un mtodo
mtodo sin
sin
cuerpo
cuerpo se
se llama
llama
operacin
operacin
Guitarrista
Guitarrista
Violinista
Violinista
AfinaTuInstrumento(
AfinaTuInstrumento( ))
AfinaTuInstrumento(
AfinaTuInstrumento( ))
42
Presentar el concepto de
clase abstracta.
Explicacin previa
No
No se
se pueden
pueden crear
crear instancias
instancias
de
de clases
clases abstractas
abstractas
Se
Se pueden
pueden crear
crear instancias
instancias
de
de clases
clases concretas
concretas
Guitarrista
Guitarrista
concrete
concrete
Recomendacin al
profesor
El ejemplo de la
transparencia es el mismo
que el empleado en la
transparencia anterior y el
mismo que se usar en la
siguiente.
Violinista
Violinista
concrete
concrete
43
Interfaces
Objetivo del tema
Explicacin previa
Cmo es posible
garantizar que todos los
msicos (sea cual sea su
tipo) derivados de Msico
de cuerda saben realmente
cmo afinar o tocar sus
instrumentos?
Msico
Msico de
de cuerda
cuerda
{{ abstract
abstract }}
Violinista
Violinista
concrete
concrete
Recomendacin al
profesor
Nada
Nada ms
ms que
que operaciones.
operaciones.
No
No se
se pueden
pueden crear
crear instancias
instancias
de
de una
una interfaz.
interfaz.
Puede
Puede contener
contener implementacin.
implementacin.
No
No se
se pueden
pueden crear
crear instancias
instancias de
de
una
una interfaz.
interfaz.
Implementa
Implementa las
las operaciones
operaciones heredadas.
heredadas.
Se
Se pueden
pueden crear
crear instancias
instancias de
de una
una clase
clase
concreta.
concreta.