5/5/2016 Tipos de Datos Abstractos Tipos de Datos Abstractos Introducción a la Programación Orientada a Objetos Si en el modelo se encapsula la representación de los atributos y la implementación de las operaciones, el tipo de dato es abstracto. La interface describe qué pueden hacer los objetos de una clase, la implementación establece cómo lo hacen. Algunos tipos son generales y más fáciles de reusar. Otros son más específicos de una aplicación en particular. El TDA String provisto por Java es muy general y seguramente podrá usarse en aplicaciones muy diversas, nuestro TDA Racional es más específico y el TDA Ciudad todavía más. Tipos de Datos Abstractos Introducción a la Programación Orientada a Objetos Al definir un tipo de dato abstracto, se extienden las facilidades provistas por el lenguaje con una nueva abstracción. Una clase que modela los atributos y el comportamiento de una colección de objetos, define un tipo de dato. Tipos de Datos Abstractos Ejemplo: Vector Implementar un TDA Vector que brinde operaciones para calcular el producto escalar de un vector, el producto vectorial entre dos vectores, la suma de dos vectores, etc. La clase que encapsula al arreglo brinda operaciones para establecer y obtener un elemento y para comparar, copiar y clonar vectores. <<constructores>> Vector (max : entero) <<comandos>> establecerElem (pos : entero, elem : real) copy (v: Vector) Asume que la Posición es válida Introducción a la Programación Orientada a Objetos Introducción a la Programación Orientada a Objetos El vector se representa mediante un arreglo de números reales. real [] vec El comentario asociado al método establecerElem establece una precondición, un compromiso para la clase cliente. Tipos de Datos Abstractos Tipos de Datos Abstractos public class Vector { Vector Asume que las longitudes son consistentes // Constructor public Vector(int m) vec = new float[m]; } { // Comandos public void establecerElem(int p,float val) { //Asume que la posición es válida vec[p] = val; Introducción a la Programación Orientada a Objetos <<consultas>> existePos (p : entero): boolean existeElem (r : real) : boolean obtenerElem (p : entero) : real cantElems () : entero prodEscalar(v : Vector) : real suma (v : Vector ) : Vector escalarXVector(e : entero) : Vector equals (v : Vector) : boolean clone () : Vector private float[] vec; Asume que la posición es válida Introducción a la Programación Orientada a Objetos real [] vec } vec es una variable que referencia a un arreglo, Vector es una clase a partir de la cual se crearán objetos 1 5/5/2016 Tipos de Datos Abstractos Tipos de Datos Abstractos // Consultas // Consultas public boolean existePos (int p) { return (p >= 0 && p < vec.length); } return vec[p]; } float pe=0; for (int i=0;i<vec.length;i++) pe= pe+v.obtenerElem(i)*vec[i]; return pe; Introducción a la Programación Orientada a Objetos //Asume que la posición es válida //Asume que las longitudes son consistentes Introducción a la Programación Orientada a Objetos public float obtenerElem (int p){ public float prodEscalar(Vector v) { } public int cantElems () { return vec.length; } Tipos de Datos Abstractos Tipos de Datos Abstractos // Consultas // Consultas public Vector escalarXVector(float esc) { Vector aux = new Vector(vec.length); Vector aux=new Vector(vec.length); float r ; for (int i=0;i<vec.length;i++) { r=vec[i]+ v.obtenerElem(i)) ; aux.establecerElem(i,r); Introducción a la Programación Orientada a Objetos //Asume que las longitudes son consistentes } return aux; for (int i=0;i<vec.length;i++) aux.establecerElem(i,vec[i]*esc); return aux; Introducción a la Programación Orientada a Objetos public Vector suma (Vector v){ } } • La entrada y salida se realiza desde la clase cliente. •La estructura está completa y la cantidad de elementos se define en el momento de la creación. • Todos los elementos ya están ingresados cuando empieza el procesamiento Tipos de Datos Abstractos public class TestVector { public static void main (String arg[]) { Vector v1,v2,v3; v1 = generaVector(m); mostrarVector(v1); v2 = generaVector(m); mostrarVector(v2); if (v1.cantElems() == v2.cantElems()) { System.out.println("Producto escalar "+ v1.prodEscalar(v2)); } else ...; Introducción a la Programación Orientada a Objetos Tipos de Datos Abstractos Introducción a la Programación Orientada a Objetos 2 5/5/2016 Tipos de Datos Abstractos v2 = v2.escalarXVector (5); System.out.println("Vector v2 X escalar "); mostrarVector(v2); // Constructor public Vector(int m) { vec=new float[m]; } Introducción a la Programación Orientada a Objetos … if (v1.cantElems() == v2.cantElems()) { System.out.println("Vector suma "); v3 = v1.suma(v2); mostrarVector(v3);} else ... Administración de Memoria public class Vector { private float[] vec; v1 Vector v1; v1=new Vector(5); Se declara una variable v1 y se crea un objeto de la clase Vector cuya referencia se almacena en v1. vec length 5 Aclaración Si quisiéramos implementar la clase especificada por el diagrama y también usar la clase Vector provista por el paquete java.util, deberíamos utilizar un nombre diferente. Introducción a la Programación Orientada a Objetos Java brinda en el paquete java.util una clase llamada Vector con características muy diferentes a la que hemos definido. 3