Publicado el 7 de Julio del 2017
1.147 visualizaciones desde el 7 de Julio del 2017
553,0 KB
37 paginas
Creado hace 17a (21/11/2007)
Programación Orientada a Objetos
TEMA 2
Clases y Objetos
(2ª parte)
Facultad de Informática
Universidad de Murcia
Índice
1. Clases Eiffel, C++ y C#
2. Objetos
- Tipos de campos: referencia vs. subobjeto
3. Métodos y mensajes
4. Creación de objetos
5. Ejemplo: representación de una lista enlazada
6. Semántica de las operaciones sobre
referencias: asignación, igualdad y copia
7. Genericidad
Clases y Objetos
2
•1
1.- Clases en Eiffel, C++ y C#
MARCO DE COMPARACIÓN (Modelo OO):
• Abstracción de tipos:
– Definición de atributos y métodos
– Atributos de clase vs. Atributos de instancia
• Ocultación de información:
– Niveles de visibilidad
• Modularidad:
– Tipos de módulos que permite el lenguaje
Clases y Objetos
3
titular : PERSONA;
saldo : INTEGER;
codigo: INTEGER;
abrir (quien: PERSONA) is do
end;
reintegro (suma: INTEGER) is do
end;
saldo:=0;
titular:=quien;
codigo:= codigos.nuevo_valor;
!!ultOper
ingreso (suma: INTEGER) is do
saldo:=saldo+suma
end;
ver_ult_oper (n: INTEGER) is do … end;
….
class CUENTA
creation abrir
feature {ALL}
end
e
s
a
l
c
e
d
n
ó
i
c
i
n
i
f
e
d
o
l
p
m
e
j
E
l
e
f
f
i
E
n
e
feature {NONE}
ultOper: LIST[INTEGER];
puedo_sacar (suma: INTEGER): Boolean is do
end;
Result:= saldo>=suma
if puedo_sacar(suma) then saldo:=saldo-suma;
-- rutina para sacar dinero
-- caracteristicas públicas
-- rutina de creación
-- codigos función ONCE
-- rutina para ingresar dinero
-- visualiza las n ultimas oper.
-- at y rutinas privadas
Clases y Objetos
4
•2
Clases en Eiffel
• Abstracción de tipos
– Atributos: saldo:INTEGER
• exportados en modo consulta (Principio de Acceso Uniforme)
• Sólo modificables por los métodos de la clase aunque sean
públicos
– Rutinas:
• procedimientos: ingreso(suma:INTEGER)is do ...end
• funciones:
puedo_sacar(suma:INTEGER):BOOLEAN is do ...end
– Variables de clase:
• Eiffel no tiene variables globales
• Funciones once = El objeto se crea sólo una vez pero puede
cambiar su valor
Clases y Objetos
5
Función once
codigos: Contador is
!!Result
once --devuelve siempre el mismo objeto Contador
end
--crea un objeto contador
• El objeto contador que devuelve se puede modificar utilizando
los métodos de la clase contador. Por ejemplo:
codigos.nuevo_valor
Siendo nuevo_valor un método de la clase Contador que
incrementa el valor del contador (de tipo INTEGER) y
devuelve ese nuevo valor.
Clases y Objetos
6
•3
Clases en Eiffel
• Ocultación de información
Especificación de acceso a un grupo de características:
– públicas: (por defecto)
– privadas:
– exportadas de forma selectiva.
feature {ALL}
feature {NONE}/feature{}
feature {A,B, ...}
• Modularidad
– El único módulo son las clases
– Cluster = Agrupación de clases relacionadas pero no es
parte del lenguaje sino que depende del entorno de
desarrollo
– Para hacer uso de un cluster se debe decir al entorno Eiffel
Clases y Objetos
7
Eiffel y Ocultación de Información
class ICE1 feature
at1: INTEGER;
...
end
class TEC1 feature
//Público
atrib1: ICE1;
atrib2: INTEGER;
una_rutina (p: INTEGER) is do
atrib2:= p;
atrib2:= atrib1.at1;
at1:= p;
atrib1.at1:= p;
end;
end
Exportación de atributos
-- clase Eiffel
en modo consulta
(=función)
-- No error
-- Error en compilación
-- Error en compilación
atrib1.setAt1(p);
Modificación:
Clases y Objetos
8
•4
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
)
z
a
f
r
e
t
n
i
(
+
+
C
n
e
e
s
a
l
c
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
)
n
ó
i
c
a
t
n
e
m
e
l
p
m
i
(
+
+
C
e
s
a
l
c
// Cuenta.h, definición del TAD Cuenta
class Cuenta {
public:
Cuenta (Persona *quien) {saldo=0;
titular=quien;
codigo = nuevoCodigo();
ultOper = new lista<int>;}
reintegro(int suma);
void
ingreso(int suma);
void
verSaldo();
int
void
verUltOper(int n);
static int nuevoCodigo();
//devuelve el ultimoCodigo y lo incrementa
private:
Persona * titular;
int
int
static int ultimoCodigo; //variable de clase
lista<int> * ultOper;
saldo;
codigo;
bool
puedoSacar(int suma) {return (saldo >=suma);}
};
Clases y Objetos
9
// cuenta.cpp, Definición de las funciones de la clase
#include “cuenta.h”
// inicializa la variable de clase
int Cuenta :: ultimoCodigo = 0;
void
}
void
}
int
}
void
}
Cuenta :: reintegro (int suma) {
if puedoSacar(suma) saldo=saldo-suma;
Cuenta :: ingreso (int suma) {
saldo=saldo+suma;
Cuenta :: verSaldo () {
return saldo;
Cuenta :: verUltOper(int n) {
...
static int Cuenta :: nuevoCodigo() {
return (ultimoCodigo++);
}
Clases y Objetos
10
•5
Clases en C++
• Abstracción de tipos
– atributos.
• No pueden ser exportados en modo consulta
• Tipos primitivos y punteros
– todas las rutinas tienen un valor de retorno.
– Atributos y métodos de clase (static)
• Ocultación de información
– Especificación de acceso para un grupo de miembros:
•public: un cliente puede consultarlo y ¡¡modificarlo!!
•private: sólo accesible dentro de la clase
– Clases amigas: Se le concede acceso TOTAL a la clase amiga
11
Clases y Objetos
Clase “amiga”
class NodoArbol {
friend class Arbol;
private:
class B {
friend class A;
private:
int i;
public: ...
}
En la clase A,
B *ob
ob -> i = 89
int dato;
NodoArbol decha;
NodoArbol izda;
…
};
class Arbol{
private:
NodoArbol *raiz;
...
… raiz ->dato=50; ...
La amistad no es hereditaria ni transitiva
};
Clases y Objetos
12
•6
Clases en C++
• Modularidad
– Definición de nuevos tipos: clases (class) y estructuras
(struct)
– Una estructura equivale a una clase con todos los miembros
públicos por defecto (se puede usar private)
– namespace: mecanismo para agrupar datos, funciones, etc.
relacionadas dentro de un espacio de nombres separado
namespace Parser {
double term(bool obten){/*multiplica y divide */}
double expr(bool obte) {/*suma y resta */}
…
}
Para usar una función: Parser::expr(…);
Clases y Objetos
13
Ficheros para la especificación de la clase
Cuenta
Cuenta.h
Interfaz de la clase
cuenta
Banco.cpp
Cuenta.cpp
#include “Cuenta.h”
utiliza Cuenta
#include “Cuenta.h”
implementa Cuenta
• #include para importar ficheros cabecera
• toda la información se use o no
• pueden ocurrir dependencias circulares que debe solucionar
el programador en lugar del compilador
Clases y Objetos
14
•7
Ejercicio
Intenta escribir en C++ la siguiente clase Eiffel,
class CELOSO
feature {NONE}
esposa: MUJER;
feature {MECANICO}
coche: AUTOMOVIL
…
end
Clases y Objetos
15
}
static Cuenta(){ //constructor de clase
}
ultimoCodigo=1;
public float Saldo{
get{
}
return saldo;
e
d
n
ó
i
c
i
n
i
f
e
d
e
d
o
l
p
m
e
j
E
#
C
n
e
e
s
a
l
c
}
using System;
namespace Banco.GestionCuentas{
public class Cuenta {
private Persona titular;
private float saldo;
private int codigo;
private static int ultimoCodigo;
private Operacion[] ultOper;
Cuenta (Persona quien){
saldo=0;
titular=quien;
codigo=nuevoCodigo();
ultOper=new Operacion[20];
saldo+=suma;
}
public virtual void Reintegro(float suma){
if puedoSacar(suma) saldo-=suma;
}
public virtual void Ingreso(float suma){
}
public void VerUltOper(int n) { ... }
public static int NuevoCodigo(){
}
private boolean puedoSacar(float suma){
}
return (saldo >=suma);
return ultimoCodigo++;
}
Clases y Objetos
16
•8
Clases en C#
• Abstracción de tipos
– especificación de atributos y métodos igual que Java
– Atributos y métodos de clase (static)
• Ocultación de Información
– public y private igual que Java y C++
– internal: accesible desde el código del ensamblado
(librería o ejecutable)
– Proteger el acceso a los atributos mediante la definición de
propiedades (principio de Acceso Uniforme)
– Se escribe el código que se ejecutará en el acceso para lectura
(get) y modificación (set) de un atributo privado de igual
nombre que la propiedad.
Clases y Objetos
17
Definición de propiedades en C#
<tipoPropiedad> <nombrePropiedad>
{
set
{
}
get
{
}
}
<códigoEscritura>
<códigoLectura>
• Puede ser una propiedad de sólo lectura (sólo se define el
get) o de sólo escritura (sólo se define el set).
Clases y Objetos
18
•9
Ejemplo de propiedad C#
class Cuenta{
…
public double Saldo
{
total = total + ultOper[i];
get
{
double total = 0;
for …
return total;
}
set
{
}
ultOper[indice]= value;
Clases y Objetos
19
}
}
• Acceso a una propiedad como si estuviéramos accediendo a uno de los
campos del objeto
Cuenta cta = new Cuenta();
cta.Saldo = 300;
Clases en C#
• Modularidad
– Definición de nuevos tipos: clases, estructuras e interfaces
– Agrupación de tipos de datos en espacios de nombres
(equivalente a los paquetes de Java)
namespace nombreEspacio{
…//tipos pertenecientes al espacio de nombres
}
– Para utilizar un tipo definido en un espacio de nombres:
•using: para importar los tipos definidos en un espacio de
nombres
• Calificar el tipo utilizando la notación punto.
Clases y Objetos
20
•10
Exportación de características entre clases
relacionadas
• ¿Cómo exportar características a un conjunto de clases
sin violar la regla de ocultación de información?
• Soluciones:
Java
– Paquetes
– Clases amigas
C++
– Exportación selectiva Eiffel
• Los paquetes añaden complejidad al lenguaje.
• Con las soluciones de Java y C++ se corre el riesgo de
perjudicar la reutilización.
Clases y Objetos
21
Ejercicio
[Examen 2/12/2005] Dada la implementación parcial de la
clase Bola en Eiffel que representa una bola en un juego
de billar, especificar una clase Java e
Comentarios de: TEMA 2 Clases y Objetos (2ª parte) (0)
No hay comentarios