Escolar Documentos
Profissional Documentos
Cultura Documentos
Apuntes de Clases
INFO 161 : Lenguajes de Programación
Programación Orientada a Objetos
1 Introducción.
Envío de Flores
Si mando flores a una dama tengo las siguientes alternativas.
Alternativas
1.Lo hago directamente enviándole un mensaje a
Margarita la florista.
2.Usando otro objeto intermedio, por ejemplo
Gertrudis, la secretaria.
· Todos los objetos de una misma clase tienen los mismos métodos.
Orientación a Objetos Página 2
LENGUAJES DE PROGRAMACIÓN
Objeto Material
Animal Planta
Mamífero Flor
Herencia.
Enlaces de Métodos.
· Un método se busca en la clase del objeto, si no se
encuentra se busca en la superclase y así sucesivamente
hasta que se encuentra. Una vez que se encuentra se
ejecuta o de lo contrario emite un mensaje de error.
Volviendo al ejemplo.
El hecho que yo no conozca con exactitud los métodos que
usará Margarita, se conoce como ocultamiento de la
información.
Colaboradores
Muestre mensaje de bienvenida, espera tarjeta
Verificador_de_NIP
Pida al Verificador_de_NIP que compruebe validez
Selector_de_Actvidad
Llame al Selector_de_Actvidad
Devuelve tarjeta a usuario
Verificador_de_NIP Colaboradores
Manejador_de_cuenta
Devuelve falso si no hay cuenta
Presenta ventana de solicitud de NIP
Recibe el NIP del usuario
Compara NIP, devuelve resultado
Orientación a Objetos Página 10
LENGUAJES DE PROGRAMACIÓN
Manejador_de_cuenta
Colaboradores
Verifica valides de cuenta; devuelve NIP
Verifica información retiro/depósito
Manejador_de_Retiros Colaboradores
Pregunta al usuario la cantidad a retirar
Manejador_de_cuenta
Verifique la cantidad con Manejador_de_Cuenta
Distribuidor_de_efectivo
Diga al Distribuidor_de_efectivo que descargue efectivo
Selector_de_actividad Colaboradores
Manejador_de_depósito
Espera selección del usuario
Manejador_de_retiros
Llamar al manejador de la transacción adecuada
Caja_electrónica Colaboradores
Dar efectivo
Manejador_de_retiros
Dar sobre de depósitos con indicación de hora
Manejador_de_depósitos
Recuperar sobre del depósito.
Orientación a Objetos Página 11
LENGUAJES DE PROGRAMACIÓN
Ejemplos.Organización
de escuela. profesores, alumnos, director, inspector, auxiliar, jardinero.
Industria. Gerente, asesores, secretaria, Ingenieros, técnicos, trabajadores,
2 Clases.
· Un objeto es una instancia de una clase.
· Un objeto tiene un estado y uno o varios métodos.
· La estado es privado y puede ser accesado solo su propios
métodos.
Objeto
estado
métodos
Una clase, es a la cual pertenecen los objetos.
Por lo tanto.
· Una clase tiene una parte pública y una parte privada.
· La parte privada tiene que ver con el estado del objeto.
· La parte pública es la interfaz al objeto.
Orientación a Objetos Página 14
LENGUAJES DE PROGRAMACIÓN
Ejemplo
class Point {
private :
int xVal, yVal;
public:
void SetPt(int,int);
void OffsetPt(int,int);
};
public:
void SetPt(int,int);
void OffsetPt(int,int);
void PrintPt() ;
};
Otro ejemplo,
Supongamos la clase fecha
class fecha {
int mes,dia,agno;
public:
void fijar(int,int,int);
void siguiente();
void imprimir();
};
void fecha::siguiente() {
dia++;
if(dia>28)....
void fecha::imprimir() {
cout<<dia<<"/"<<mes<<"/"<<agno<<'\n';
}
Si definimos un objeto hoy, por ejemplo,
fecha hoy;
Como poder obtener el dia, mesy agnodel objeto hoy?
Respuesta.
El dia, mesy agnode hoy son privados. Por lo tanto la
única forma es a través de una función miembro. Tendremos
entonces que agregar una función miembro a la clase.
void obtener(int*,int*,int*);
class fecha {
int mes,dia,agno;
public:
void fijar(int d,int m, int a)
<<mes<<"/"
<<agno<<'\n';}
};
int a) {
dia=d;
mes=m;
agno=a;
2.3 Constructores
Supongamos que declaramos un objeto ptde la clase
Point y posteriormente, invocamos el métodos OffsetPt
e imprimimos el resultado. ¿ Que ocurre ?
Point pt;
pt.OffsetPt(2,2);
pt.PrintPt();
y
fecha hoy;
hoy fijar(26,4,96)
y
fecha hoy(26,4,96);
void OffsetPt(int,int);
void PrintPt() ;
};
Notas :
· El constructor esta declarado en línea, pero no es
necesario.
· El constructor no debe estar precedido por algún tipo o
void.
Orientación a Objetos Página 22
LENGUAJES DE PROGRAMACIÓN
y
fecha hoy(26,4,96), eclipse(5,5,96);
Point() {xVal=yVal=0;}
void OffsetPt(int,int);
void PrintPt() ;
};
};
Así
· pttrabaja en coordenadas cartesianas,
· pt1en coordenadas polares y
· pt2 en coordenadas cartesianas pero se inicializa con 0.
De igual manera con los objetos de la clase fecha.
Se podría ingresar fecha de distintas maneras, por ejemplo
en forma int dia,char* mes, int* agno.
2.4 Destructores.
En algunos casos los objetos creados, necesitan espacio en
memoria adicional, el cual debe ser creado en la función
constructor, por ejemplo crear un arreglo,
Orientación a Objetos Página 24
LENGUAJES DE PROGRAMACIÓN
class vector {
int tamagno;
int* v;
.
public:
vector(int); // constructor
.
.
donde
vector::vector(int t) {
tamagno=t;
v=new int[t]; // asigna espacio a
// un arreglo de t
// enteros
}
ejemplo
class vector {
int tamagno;
int* v;
.
public:
vector(int); // constructor
~vector(); // destructor
.
donde
vector::~vector() {
delete [] v;
// libera el espacio
// que ocupaba el
// arreglo al que
// apunta v
Orientación a Objetos
Página 26
LENGUAJES DE PROGRAMACIÓN
r.elem(i)=0;
for(int j=0;j<3;j++)
r.elem(i)+=m.elem(i,j)*v.elem(j);
}
return r;
class vector {
float v[4];
//..
friend vector multiplicar(const
matriz&,
const vector&);
}
class matriz {
vector v[4];
//..
friend vector multiplicar(const
matriz&,
const vector&);
}
const vector& v) {
vector r;
for(int i=0;i<3;i++) {
r.v[i]=0;
for(int j=0;j<3;j++)
r.v[i]+=m.v[i][j]*v.v[j];
}
return r;
};
class y {
//..
friend void x::f();
};
2.6 Ejercicios.
1.Escribir programas completos con las clases Point y Fecha,
sin usar constructores y usándolos.
3.Defina una clase letra que tenga como funciones:
métodos:
fijarX(int nuevoX)
obtenerX()
fijarY(int nuevoY)
obtenerY()
métodos:
fijarX(int nuevoX)
obtenerX()
fijarY(int nuevoY)
obtenerY()
fijarRadio(int nuevoRadio)
obtenerRadio()
class Logo {
atributos :
Circulo circulo
Triangulo triangulo
métodos:
fijarLogo(Punto donde)
}
Circulo TrianguloLogoParte - De
Parte - De
3.1.4 Relación Tiene - Un
Esta es la relación inversa de la relacion Parte - De
Circulo TrianguloLogo
Parte - De Parte - De
Tiene - Un Tiene - Un
3.2 Herencia
Con la herencia podemos usar la relación A - Kind - Of
para clases y la relación Is - A para objetos.
Las clases que son A - Kind - Of otra clase comparte
propiedades de las últimas. Por ejemplo si se declara la clase
Circulo como heredada de Punto, se tiene:
Orientación a Objetos Página 35
LENGUAJES DE PROGRAMACIÓN
metodos:
fijarRadio(int nuevoRadio)
obtenerRadio()
}
apunto.fijaX(apunto.obtenerX()+delta_x)
}
...
Del ejemplo
Punto
heredada de
Circulo
3.3 Herencia Múltiple
Una clase puede ser subclase de mas de una superclase.
Una subclase por lo tanto puede mesclar las propiedades
heredadas de las superclases.
Supongamos que existe una clase Stringque permite
manipilación de texto. Por ejemplo con un método que
permite agregarotro texto. Si en nuestro programa que
dibuja objetos queremos agregar texto.
Sería interesante que además podamos podamos mover el
texto en el dibujo.
Para resolver el problema crearemos una clase
String_Dibujableque herede las propiedades de
Puntoy String.
Orientación a Objetos Página 38
LENGUAJES DE PROGRAMACIÓN
Punto String
String_Dibujable
atributos:
// todos los heredados de las
// superclases
métodos:
// todos los heredados de las
// superclases
String_Dibujable dstring
...
move(dstring, 10)
...
Definición.
métodos:
print()
}
Ejemplo
class Punto heredada de Objeto_Dibujable
{
atributos:
int x,y
métodos :
fijarX(int nuevoX)
obtenerX()
fijarY(int nuevoY)
obtenerY()
Definición.
Una clase A es llamada abstracta si sólo es usada como
superclase para otras clases. La clase A sólo especifica
propiedades. Esta no es usada para crear objetos. Las clases
derivadas deben definir las propiedades de A.
3.3.2 Ejercicios
1.- Herencia. Considere los siguientes programas de dibujo.
a) Defina la clase Rectángulopor herencia de Punto. El
punto debe indicar la esquina superior izquierda del
rectángulo. ¿ Cuales son sus atributos. ?. ¿ Que métodos
adicionales debe agregar ?.
Orientación a Objetos Página 43
LENGUAJES DE PROGRAMACIÓN
métodos:
fijarZ(int nuevoZ)
obtenerZ()
}
4 Herencia en C++
Asumamos que tenemos la clase Puntocomo,
class Punto {
int _x, _y;
public:
Punto() {_x=_y=0;}
Punto(const int x, const int y)
{_x=x; _y=y;}
~Punto() {// nada }
void fijarX(const int x){_x=x;}
void fijarY(const int y){_y=y;}
int obtenerX(){return _x;}
int obtenerY(){return _y;}
public:
Punto3D(){fijarX(0);fijarY(0);_z=0}
Punto3D(const int x,
const int y,
const int z,) {
fijarX(x);fijarY(y);_z=z
}
4.2 Construcción
Note que la inicialización de una instancia de Punto3Dse
hace usando un constructor, el cual llama los métodos
públicos de Punto para inicializar xe y.
Sin embargo, podría haberse usado el constructor de Punto,
es decir,
class Punto3D : public Punto {
int _z;
public:
Punto3D():Punto(){_z=0;}
Punto3D(const int x,
const int y,
const int z,): Punto(x,y)
{_z=z; }
class Logo{
Circulo acirc;
Rectangulo arec;
...
public:
Logo(Circulo c, Rectangulo r):
Circulo(a),Rectangulo(r){}
....
public:
Punto():_x(0),_y(0) {}
Punto(const int x, const int y):
_x(x),_y(y){}
...
...
4.3 Destrucción
Si un objeto es destruido, los destructores de las superclases
también son invocados.
Orientación a Objetos Página 49
LENGUAJES DE PROGRAMACIÓN
public ObjetoDibujable {
...
public:
StringDibujable(...):Punto(...),
ObjetoDibujable(...)
{ ... }
};
4.5 Polimorfismo
Es posible crear métodos virtuales de alguna clase particular,
para poder mas tarde se definidos. En C++
class ObjetoDibujable {
public:
virtual void print();
};
Si ahora declaramos
class Punto : public ObjetoDibujable {
...
public:
void print(){ ... // definición }
}
&obj) {
obj.print();
}
class Color {
public:
virtual ~Color();
};
~RojoFuerte();
};
Si se define paletacomo,
Color *paleta[3];
paleta[1]=new RojoFuerte;
paleta[2]=new Color;
delete palette[0];
// invoca al destructor ~Rojo y de ~Color()
delete palette[1];
// invoca a destructor ~RojoFuerte y ~Color()
delete palette[2];
// invoca al destructor ~Color()
public:
...
};
Con =0 estamos obligando a el método print()sea
definido en la subclase.
5 Sobrecarga de Operadores
Para tipos definidos por el usuario, es posible re-definir los
operadores establecidos para los tipos concretos, es decir +,
-, * , / , etc.
Por ejemplo supongamos la clase Complejode la siguiente
forma
class Complejo {
double _real, _imag;
public:
Complejo(): _real(0.0), _imag(0.0) {}
Complejo(const double real,
_real(real), _imag(imag) {}
Complejo suma(const Complejo op);
Complejo mul(const Complejo op);
...
};
Luego si se define
Complejo a(1.0, 2.0), b(3.5, 1.2), c;
c=a.suma(b);
se asigna la suma de ay ba c.
Esto es correcto, sin embargo resulta mas entendible usar el
operador +.
public:
...
Complejo operator+(const Complejo
&op) {
double real = _real+op._real,
imag = _imag+op._imag;
return(Complejo(real,imag));
}
...
};
public:
double real(return _real);
double imag(return _imag);
...
...
};
class Complejo {
double _real, _imag;
public:
...
friend Complejo operator+(Complejo a1,
Complejo a2);
...
...
};
}
...
...
{_real=r; _imag=i; }
void print();
friend Complejo operator+(Complejo,Complejo);
friend Complejo operator*(Complejo,Complejo);
friend Complejo operator/(Complejo,Complejo);
};
void
Complejo :: print(){
cout << _real << + <<_imag << \n ;
}
Complejo
operator+(Complejo a1, Complejo a2) {
return complejo
(a1._real + a2._real, a1._imag+a2._imag)
}
Complejo
operator*(Complejo a1, Complejo a2) {
Tarea
Complejo
operator/(Complejo a1, Complejo a2)
6 Tipos Genéricos
Los Tipos de Datos Abstractos (TDA) se usan para definir
tipos creados por el usuario. A partir de los cuales nacen las
clases.
Por ejemplo se puede pensar en una lista de manzanas, autos
o cualquier lista.
La definición semántica de la lista es siempre la misma.
Solo cambia el tipo de datos de acuerdo al tipo de lista.
Esta información adicional puede ser especificada por un
parámetro genérico el cual es especificado al momento de la
creación de la instancia..
De esta forma una instancia de un TDA genérico es una
instancia de una variante particular de un TDA.
Por ejemplo
Lista<Manzanas> Lista_de_Manzanas
atributos :
...//Datos necesarios
métodos :
agregar (T elemento)
T obtener_primero()
T obtener_proximo()
...
}
atributos :
...//Datos necesarios
métodos :
Manzana obtener_primero()
Manzana obtener_proximo()
...
}
...
...
};
a=b;
b=tmp;
};
int main()
{
int a=3;
b=16;
double
p1=3.14;
e=2.17;
Persona
yo ( Luis Alvarez )
tu ( Juan Peres )
swap(a,b);
cout << a = << a << b = << b;
swap(p1,e);
cout << pi = << pi << e = << e;
swap(yo,tu);
cout << yo = << yo << tu = << tu;
return(0);
a=b;
b=tmp;
ejemplo,
template <class K, class T>
class Diccionario {
...
public :
...
K sacar_1(const T palabra_2);
T sacar_2(const K palabra_1);
...
}
T _almacen[tamaño];
public :
...
};
Stack<int,128> mi_stack;
Implantación.El
block básico de una lista es el nodo. Así la primera clase a
declarar será Nodo.
Lo único que contiene un nodo is un puntero al próximo
vecino (a la derecha).
Class Nodo {
Nodo *_derecha;
public :
Nodo(Nodo *derecha=NULL) :
_derecha(derecha) {}
Nodo(const Nodo &val) :
_derecha(val._derecha) {}
};
...
int xx() ;
};
public:
Data_Nodo(const T data, Data_Nodo
*derecha=NULL) :
Nodo(derecha), _data(data) {}
Data_Nodo(const Data_Nodo &val) :
Nodo(val), _data(val._data) {}
Nodo::derecha());}
...
...