56
M AYO 2 0 1 3
RW 056-062 Hipopresivos.indd 56
24/04/2013 19:58:32
METIENDO
TRIPA EJERCICIOS HIPOPRESIVOS PARA CORREDORAS QUE LOS EJERCICIOS H
Story Transcript
Herencia Amparo L´ opez Gaona
Septiembre de 2008
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
1 / 58
Introducci´on Las clases no existen en el vac´ıo, normalmente se relacionan unas con otras. Relaci´on de uso. Relaci´on de agregaci´on/contenci´ on. Relaci´on de herencia. Se garantiza que objetos de una clase pueden usar objetos de otra clase respetando una funcionalidad existente. Desde el punto de vista de extensibilidad es deseable poder modificar o adaptar clases existentes a nuevas necesidades, sin violar el encapsulamiento.
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
2 / 58
Ampliaci´on mediante herencia Hacer un programa para el mantenimiento de cuentas bancarias: cuentas de d´ebito, cuentas con pago autom´atico de servicios y cuentas de cr´edito. Con todas se permite retirar dinero, depositar dinero y conocer el saldo de la misma. Las cuentas con pago de servicio adem´as permiten el pago autom´atico del tel´efono y las cuentas de cr´edito permiten comprar a cr´edito y consultar este cr´edito.
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
3 / 58
Ampliaci´on mediante herencia Hacer un programa para el mantenimiento de cuentas bancarias: cuentas de d´ebito, cuentas con pago autom´atico de servicios y cuentas de cr´edito. Con todas se permite retirar dinero, depositar dinero y conocer el saldo de la misma. Las cuentas con pago de servicio adem´as permiten el pago autom´atico del tel´efono y las cuentas de cr´edito permiten comprar a cr´edito y consultar este cr´edito. 1 Encontrar los objetos principales. cuenta bancaria, cuenta de d´ebito, cuenta con pago y cuenta de cr´edito 2 Determinar el comportamiento deseado para cada objeto. Cuenta bancaria: Crear una cuenta. Retirar dinero. Depositar dinero. Consultar saldo.
Para resolver este problema existen al menos tres posibilidades: 1
Modificar la clase Cuenta agregando los m´etodos requeridos.
2
Copiar el c´odigo de Cuenta en el programa para el pago de servicios y hacer el cambio necesario.
3
Usar el mecanismo de herencia. Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
5 / 58
... Ampliaci´on mediante herencia La herencia permite definir una nueva clase Cn a partir de una clase existente C . En la clase Cn se definen s´ olo los atributos y los m´etodos que difieren de los existentes en la clase C y autom´aticamente se incluyen los m´etodos y atributos de C . La clase Cn se denomina subclase o clase derivada y la clase C se conoce como superclase, clase base o clase padre. public class CuentaConServicios extends Cuenta { /** M’etodo para pagar el tel’efono ... * @param numTel - N’umero telef’onico a donde se har’a el pago * @param monto - Cantidad que debe pagarse */ public void pagarTelefono(String numTel, double monto) { retirar(monto); ... // C’odigo para pagar el tel’efono saldo += 100.00; } Herencia Septiembre de 2008 7 / 58 } Amparo L´opez Gaona ()
... Ampliaci´on mediante herencia Un objeto de la clase derivada tiene todos los componentes de la clase base de la cual hereda m´as los definidos en esta misma clase, como se muestra en la siguiente tabla. Clase: Estructura: Comportamiento:
Control de acceso Inv´alido modificar la variable saldo de la clase Cuenta. Si se quiere tener elementos privados para todas las clases excepto para las clases derivadas, es necesario que se declaren utilizando la palabra reservada protected.
Clase A
private
Clase B
public
Clase A1
Clase A2 protected
public class Cuenta { protected double saldo; ... } //depositar(100.00); Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
10 / 58
Constructores El constructor de la clase base proporciona el estado inicial para la parte heredada. Se llama cuando se crea el objeto de la clase derivada. El constructor de la clase derivada maneja la parte agregada por ´esta. El constructor de una clase derivada incluye la llamada (super) a uno de los constructores de la clase base que se ejecutar´a antes que el cuerpo del constructor de la clase derivada. public CuentaConServicios (double montoInicial) { super(montoInicial); }
En este caso el constructor de la subclase no a˜ nade nada al constructor de la superclase, pero puede hacerlo. En una jerarqu´ıa de herencia, la creaci´ on de un objeto de una clase derivada puede causar una serie de llamadas a constructores en la jerarqu´ıa. Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
12 / 58
... Constructores class Base { private int x, y; public Base(int a) { x = a; y = 1000;} public Base(int a, int b) { x = a; y = b;}; public void pintaB() {System.out.println(x+ " " + y);} } class Derivada extends Base{ private int z; public Derivada (int n) { z = n;} public void pintaD() {System.out.println(z);} } public class UsoHer{ public static void main(String x[]) { Base unB = new Base(1,2); Derivada unD = new Derivada(4); unB.pintaB(); unD.pintaD(); }} Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
14 / 58
Uso de clases derivadas
public class UsaCuenta { public static void main(String[] pps) { ... // Declaraciones necesarias // Solicita y valida capital inicial cuenta=new CuentaConServicios(capital); // Crea la cuenta do { ... //Muestra menu de opciones y pide seleccionar alguna switch(opcion) { case ’1’: //Retiro System.out.println("?‘Cuanto dinero quieres retirar?"); capital=io.readDouble(); cuenta.retirar(capital); break; case ’2’: //Deposito System.out.println("?‘Que cantidad deseas depositar?"); capital=io.readDouble(); cuenta.depositar(capital); break; case ’3’: // Saldo System.out.println("Tu saldo es de:$" + cuenta.obtenerSaldo()); break; case ’4’: // $Pago de telefono System.out.println("?‘Cuanto dinero vas a pagar?"); capital=io.readDouble(); cuenta.pagarTelefono(capital); System.out.println("Telefono pagado, gracias"); break; case ’9’: //Fin del programa System.out.println("*** Hasta pronto. ***"); otra = false; break; default: Amparo L´ opez Gaona () Herencia \unhbox \voidb@x \bgroupSeptiembre de 2008 16 \setbo / 58 System.out.println("Opci\penalty \@M \hskip \z@skip \let \unhbox \voidb@x
Especializaci´on mediante herencia Clase: Estructura:
Especializaci´on mediante herencia public class CuentaDeCredito extends Cuenta { private double limite; // Limite de credito private double deuda; // Monto de la deuda public CuentaDeCredito (double credito) {
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
19 / 58
Especializaci´on mediante herencia public class CuentaDeCredito extends Cuenta { private double limite; // Limite de credito private double deuda; // Monto de la deuda public CuentaDeCredito (double credito) { super (credito); limite = credito; deuda = 0; } public double obtenerValorDeuda() { return deuda; } public boolean comprar(double monto) { if (monto > 0.0 && monto < saldo ) { deuda += monto; retirar (monto); // saldo -= monto; return true; Amparo L´ opez Gaona () Herencia Septiembre de 2008 } else {
19 / 58
Especializaci´on mediante herencia public void retirar (double monto) {
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
21 / 58
Especializaci´on mediante herencia public void retirar (double monto) { if (monto >0.0 && monto 0) { saldo += monto; }}
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
39 / 58
Manejo de errores public void depositar(double monto) { if (monto > 0) { saldo += monto; }}
public void depositar(double monto) { if (monto > 0) { saldo += monto; } else { System.out.println("No es posible depositar "+ monto + " pesos." }}
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
39 / 58
Manejo de errores public void depositar(double monto) { if (monto > 0) { saldo += monto; }}
public void depositar(double monto) { if (monto > 0) { saldo += monto; } else { System.out.println("No es posible depositar "+ monto + " pesos." }} public boolean depositar(double monto) { if (monto > 0) { saldo += monto; return true; } System.out.println("No es posible depositar "+ monto + " pesos.") return false; Herencia Septiembre de 2008 39 / 58 } Amparo L´opez Gaona ()
... Manejo de errores Una excepci´ on (exceptional event) es un evento que ocurre en cualquier momento de ejecuci´ on de un programa y que modifica el flujo normal de este. Son objetos de la clase Exception que almacenan informaci´on que se regresa en caso de que ocurra una anormalidad. Una excepci´on es “disparada” o activada para indicar que ocurri´o una falla durante la ejecuci´ on de un m´etodo. La excepci´on se propaga hasta encontrar un m´etodo que la “atrape” en el cual se indica qu´e se debe hacer en circunstancias an´omalas. Por ejemplo, imprimir un mensaje de error y no hacer nada m´as, terminar el programa (con o sin mensaje de error), realizar la tarea de cualquier forma, pedir la correcci´ on de manera interactiva, etc´etera.
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
40 / 58
Jerarqu´ıa de excepciones La clase Exception del paquete java.lang es descendiente de la clase Object. Object
Estados de una excepci´on Las excepciones pasan por un conjunto de estados: Disparo de una excepci´ on: Se crea un objeto Exception y el control pasa al sistema de ejecuci´ on. Principales ventajas de esta forma de tratar con errores o casos excepcionales es que para el usuario resulta imposible ignorarlos. Atrapado una excepci´ on: Encontrar un m´etodo que responda a la excepci´on. Finalizar: Si no se encuentra m´etodo se termina la ejecuci´on del programa. En caso contrario se recupera de la excepci´on.
Amparo L´ opez Gaona ()
Herencia
Septiembre de 2008
42 / 58
Disparo de excepciones Disparar una excepci´on es la forma m´as efectiva para indicar que no es posible atender la petici´on del objeto que env´ıa el mensaje. public void depositar(double monto) throws Exception { if (monto < 0) { throw Exception("Deposito incorrecto"); } saldo += monto; }
public double retirar(double monto) throws Exception { if (monto