Tema 2: Clases y Objetos Anexo: tipo de datos Pila Programación Orientada a Objetos Curso 2017/2018
Características del paradigma OO Curso 2017/2018 Programación Orientada a Objetos 2
Características del paradigma OO Curso 2017/2018 Programación Orientada a Objetos 3
Abstracción. Tipo de datos Pila Definición del tipo de datos Pila: inserta(x) añade x a la pila convirtiéndolo en el nuevo tope recupera() devuelve el elemento situado en el tope suprime() elimina el elemento situado en el tope vacía() devuelve verdadero si está vacía Fuente: Apuntes TP Juan Antonio Laguna Curso 2017/2018 Programación Orientada a Objetos 4
Pila Especificación en C En C, la especificación de un tipo de datos se realiza en ficheros cabecera (.h) #ifndef PILA_H #define PILA_H typedef int Elemento; typedef struct PilaRep * Pila; Pila crea(); void libera(pila p); void inserta(pila p, Elemento e); void suprime(pila p); Elemento recupera(pila p); int vacia(pila p); #endif Curso 2017/2018 Programación Orientada a Objetos 5
Pila Implementación en C La implementación de un tipo de datos se realiza en los ficheros de código fuente (extensión.c) Para un mismo tipo de datos podemos tener diferentes implementaciones. Así, por ejemplo, un pila puede ser implementada: Estática, basada en un array para almacenar los elementos. Dinámica, utilizando nodos enlazados, donde cada nodo contiene un elemento. Pila.h (definición TAD) PilaEstatica.c (representación Array) PilaDinamica.c (representación Nodos Enlazados) Curso 2017/2018 Programación Orientada a Objetos 6
Pila Estática - C #include"pila.h" #include<stdlib.h> PilaEstatica.c #define MAX 100 struct PilaRep Elemento elem[max]; int tope; ; Pila crea() Pila p = malloc(sizeof(struct PilaRep)); p->tope = -1; return p; void libera(pila p) free(p); // continúa Curso 2017/2018 Programación Orientada a Objetos 7
Pila Estática C // continúa void inserta(pila p, Elemento e) p->tope++; p->elem[p->tope] = e; void suprime(pila p) p->tope--; Elemento recupera(pila p) return p->elem[p->tope]; int vacia(pila p) return (p->tope==-1); int llena(pila p) return (p->tope==max-1); PilaEstatica.c Curso 2017/2018 Programación Orientada a Objetos 8
Pila estática C En C conseguimos aplicar ocultación de la información gracias a que la estructura de datos se define en el fichero de código fuente (struct PilaRep). Por tanto, el código que utilice el tipo de datos pila no conoce ni tiene acceso a la estructura de datos. Curso 2017/2018 Programación Orientada a Objetos 9
Pila Estática Java En Java, el concepto de clase permite especificar un tipo de datos e implementarlo en el mismo módulo. Además, ofrece encapsulamiento: la estructura de datos y el comportamiento (métodos) se definen conjuntamente en el mismo módulo. La función crea en C tiene el rol de un constructor de la clase. En Java, la memoria se libera automáticamente. Por tanto, no es necesario proporcionar una función libera. Los métodos no tienen como parámetro la pila. Trabajan sobre el objeto receptor de la llamada (this). Curso 2017/2018 Programación Orientada a Objetos 10
Pila Estática Java package pilas; public class PilaEstatica private static final int MAX = 100; // atributos de implementación private int[] elem; private int tope; public PilaEstatica() this.elem = new int[max]; this.tope = -1; // No hay destructor (libera) // continúa Curso 2017/2018 Programación Orientada a Objetos 11
Pila Estática Java // continúa public void inserta(int e) this.tope++; this.elem[this.tope] = e; public void suprime() this.tope--; public int recupera() return this.elem[this.tope]; public boolean vacia() return this.tope == -1; // Método para pilas limitadas public boolean llena() return this.tope == MAX - 1; Curso 2017/2018 Programación Orientada a Objetos 12
Encapsulación en Java public class PilaEstatica Estructura private static final int MAX = 100; private int[] elem; private int tope; public void inserta(int e) Comportamiento // this.tope++; this.elem[this.tope] = e; public void suprime() this.tope--; Curso 2017/2018 Programación Orientada a Objetos 13
Ocultación de Información en Java public class PilaEstatica Estructura Comportamiento final static int N = 100; int[] datos = new int[n]; int tope = -1; void inserta(int e) tope = tope +1; datos[tope] = x; void suprime() Privado Privado Privado Curso 2017/2018 Programación Orientada a Objetos 14
Pila Dinámica C #include "Pila.h" #include <stdlib.h> struct PilaRep Elemento elem; Pila sig; ; Pila crea() Pila p = malloc(sizeof(struct PilaRep)); p->sig = NULL; return p; void libera(pila p) while (p!= NULL) Pila aux = p; p = aux->sig; free(aux); // continúa... Curso 2017/2018 Programación Orientada a Objetos 15
Pila Dinámica C // continúa void inserta(pila p, Elemento e) Pila aux = malloc(sizeof(struct PilaRep)); aux->elem = e; aux->sig = p->sig; p->sig = aux; void suprime(pila p) Pila aux = p->sig; p->sig = p->sig->sig; free(aux); Elemento recupera(pila p) return p->sig->elem; int vacia(pila p) return (p->sig==null); Curso 2017/2018 Programación Orientada a Objetos 16
Pila Dinámica - Java En la implementación en C de la pila dinámia, el tipo que representa a la Pila tiene una definición recursiva: el campo sig es de tipo Pila. En la implementación Java optamos por introducir un tipo Nodo. Este nuevo tipo de datos debe tener un uso restringido a la implementación de la pila. Por tanto, la declaración del tipo tiene visibilidad a nivel de paquete: Solo los tipos de datos del paquete pilas pueden utilizar el tipo Nodo. Curso 2017/2018 Programación Orientada a Objetos 17
Pila Dinámica - Java package pilas; //Declaraciones a nivel de paquete class Nodo // Visibilidad privada // La implementación de la pila no tiene acceso private final int dato; private final Nodo sig; Nodo(int dato, Nodo sig) this.dato = dato; this.sig = sig; int getdato() return dato; Nodo getsig() return sig; Curso 2017/2018 Programación Orientada a Objetos 18
Pila Dinámica - Java package pilas; public class PilaDinamica private Nodo tope; public PilaDinamica() this.tope = null; public void inserta(int e) Nodo nuevo = new Nodo(e, this.tope); this.tope = nuevo; public void suprime() Nodo borrar = this.tope; this.tope = borrar.getsig(); // continúa Curso 2017/2018 Programación Orientada a Objetos 19
Pila Dinámica - Java package pilas; public class PilaDinamica // public int recupera() return this.tope.getdato(); public boolean vacia() return this.tope == null; // No tiene método llena Curso 2017/2018 Programación Orientada a Objetos 20
Programa en C Un programa en C no necesita conocer la implementación de la pila que se está utilizando. La implementación se enlaza durante la compilación. #include <stdio.h> #include "pila.h" int main() Pila pila = crea(); inserta(pila, 3); inserta(pila, 5); int valor = recupera(pila); printf("cima de la pila: %d", valor); // 5 libera(pila); return 0; Curso 2017/2018 Programación Orientada a Objetos 21
Programa en Java En cambio, un programa Java sí necesita conocer la implementación (clase) de la pila que utiliza. No obstante, en el tema 3 se introduce el concepto de interfaz que resuelve en parte este inconveniente. public class Programa public static void main(string[] args) PilaEstatica pila = new PilaEstatica(); pila.inserta(3); pila.inserta(5); int valor = pila.recupera(); Importante: las operaciones se aplican sobre el objeto System.out.printf("Cima de la pila: %d", valor); Curso 2017/2018 Programación Orientada a Objetos 22