Herencia y tipos

Download Report

Transcript Herencia y tipos

Herencia y tipos
●
●
●
Cuanta memoria se debe asignar a un objeto cuando se asigna en
la pila
La asignación debe hacerse antes de que se conozca la cantida de
memoria a asignar
Posibles soluciones:
–
Asignar la cantidad de memoria necesaria sólo para la clase
base (C++)
–
Asignar la cantidad de memoria máxima para cualquier valor
legal (difícil de implementar)
–
Asignar sólo la memoria para tener un apuntador y asignar el
espacio neceario en el montículo en tiempo de ejecución (C++,
Java, Object Pascal, Smalltalk, otros)
Herencia y tipos
En C++
●
●
●
Si el objeto se asigna en memoria dinámica se determina en
tiempo de ejecución la cantidad de memoria requerida por la clase
Si la variable se asigna en la pila se asigna sólo la cantidad de
memoria necesaria para la clase base (estáticamente)
Cuando se invoca un método se usa enlace estático (se ejecutan
solo los métodos declarados en la clase base)
Herencia y tipos
●
Ejemplo
class Ventana {
int altura;
int ancho;
...
public:
virtual void oops();
};
class VentanaDeTexto : public Ventana {
char *indice;
int ubicacionCursor;
public:
virtual void oops();
}
Ventana X;
Ventana *Y;
Y = new VentanaDeTexto;
X = *Y
// el objeto *Y es truncado
Herencia y tipos
En Java (Object pascal, smalltalk)
●
●
Los objetos siempre son asignados en memoria
dinámica en tiempo de ejecución
Al declarar una variable dentro de un método en
la pila solo se guarda la referencia del objeto
Asignación e igualdad
Asignación
●
Semántica de copia.
●
Semántica de apuntadores.
Asignación e igualdad
Asignación en C++
●
●
●
●
El comportamiento por defecto en C++ es copiar
cada miembro del objeto
Es posible hacer sobrecarga del operador =
En este caso el programador determina lo que
ocurrirá cuando se asigna un objeto a otro
No se debe confundir la asignación con la
inicialización (constructores de copia)
Asignación e igualdad
Asignación en Java
●
El operador = usa semántica de apuntadores
●
El método clone() se puede usar para producir una copia del objeto
●
Propósito general de clone()
–
x.clone() != x
–
x.clone().getClass() == x.getClass()
●
Estos no son requerimientos absolutos
●
El método clone() definido en la clase objeto
–
Requiere que la clase del objeto implemente la interfaz
clonable
–
Realiza una copia poco profunda (shalow copy)
Asignación e igualdad
Igualdad
●
Identidad
●
Igualdad de valores
Asignación e igualdad
●
Igualdad en C++
–
No está definida para objetos
–
Se puede sobrecargar el operador ==
Asignación e igualdad
Igualdad en Java
●
●
●
El operador == utiliza semántica de punteros (identidad)
El método equals definido en la clase objeto permite determinar la
igualdad de dos objetos.
Al redefinir equals se debe cumplir con lo siguiente
–
Es reflexivo: para cualquier referencia x, x.equals(x) debe devolver true.
–
Es simétrico: para dos referencias x, y, x.equals(y) debe devolver true si y
solo si y.equals(x) devuelve true.
–
Es transitiva: para cualesquiera referencias x, y, z, si x.equals(y) devuelve
true y y.equals(z) devuelve true, x.equals(z) debe devolver true.
–
Es consistente: para cualquier referencia x and y, múltiples invocaciones de
x.equals(y) consistentemente devuelven true or consistentemente devuelven
false.
–
Para cualquier referencia no-nula x, x.equals(null) devuelve false.
Acoplamiento y cohesión
●
●
●
●
Conceptos introducidos para evaluar el uso
efectivo de módulos
Acoplamiento: se refiere al grado de
interconexión entre módulos
Cohesión: se refiere a que tan integrados están los
componentes de un módulo
Estos conceptos pueden ser extendidos a clases
Acoplamiento y cohesión
Tipos de acoplamiento
●
●
●
Acoplamiento interno de datos. Se hace acceso directo a variables
de un módulo (o clase).
Acoplamiento global de datos. Dos o más módulos acceden a
variables globales comunes.
Acoplamiento de control o de secuencia. Ciertos métodos deben
ser ejecutados en un orden predeterminado
●
Acoplamiento de parámetros. Inevitable.
●
Acoplamiento de clases (herencia).
Acoplamiento y cohesión
Cohesión
●
●
●
●
●
Cohesión coincidente. Los elementos se agrupan sin razón
aparente.
Cohesión lógica. La conexión es a nivel conceptual. No se
manipulan datos comunes.
Cohesión temporal. Los procedimientos se agrupan porque todos
deben ejecutarse en un momento determinado (ej. inicialización).
Cohesión de comunicación. Acceso común a dispositivos de
entrada/salida.
Cohesión secuencial. Los elementos del módulo se juntan porque
deben ser ejecutados en cierto orden
Acoplamiento y cohesión
●
●
Cohesión funcional. Todos los elementos se unen para ejecutar una
función única.
Cohesión de datos. Un módulo define internamente un conjunto de
valores datos y exporta rutinas que manipulan dicha estructura de
datos.