Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Taller de Lenguajes II Temas de hoy: • Herencia − Definición − La cláusula extends − Sobreescritura − La clase Object. Los métodos equals() y toString() • Clases abstractas y métodos abstractos − Definición − La palabra clave abstract • Polimorfismo – Definición – Binding Dinámico Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Herencia "es el mecanismo que permite definir una clase de objetos tomando como base la definición de otra clase" Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Herencia La programación orientada a objetos permite a las clases expresar similitudes entre objetos que tienen características y comportamiento común. Estas similitudes pueden expresarse usando herencia. El término herencia se refiere al hecho que una clase hereda los atributos (variables) y el comportamiento (métodos) de otra clase. calzado vestimenta remera color precio número tipo_mang a Una de las contribuciones más interesantes de la herencia es la flexibilidad que proporciona para capturar y aprovechar al máximo las características comunes de diferentes clases de objetos. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Herencia Ejemplo Si tenemos que modelar la clase: - ¿Cómo la modelaríamos? - ¿Cuáles serían sus atributos? número - marca - ¿Cuál sería su comportamiento? sonar – llamar Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Si tenemos que modelar la clase: - ¿Cómo la modelaríamos? - ¿Cuáles serían sus atributos? número - marca - antena - ¿Cuál sería su comportamiento? sonar – llamar enviar mensajes Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Si tenemos que modelar la clase: - ¿Cómo la modelaríamos? - ¿Cuáles serían sus atributos? número - marca - ubicación - ¿Cuál sería su comportamiento? recibir crédito – llamar controlar crédito Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Cada uno de estos tipos de teléfonos tienen “características y comportamiento común”. Podemos observar claramente que tanto la clase Teléfono Celular como Teléfono Público heredan atributos y comportamiento de la clase Teléfono. Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava ClaseA (clase base o superclase) ClaseB (clase derivada o subclase) Diagrama de clases con herencia La clase ClaseA es la superclase de la clase ClaseB La clase ClaseB es subclase de la clase ClaseA. Herencia superclase y subclase La clase que hereda se llama subclase o clase derivada y a la clase de partida se la llama superclase o clase base. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava TELEFONO •numero •marca llamar(numero) sonar() TELEFONO PUBLICO •numero •marca •ubicacion llamar(numero) recibirCredito(moneda) controlarCredito() TELEFONO CELULAR •numero •marca •antena llamar(numero) sonar() enviarMensaje(mensaje,numero) La jerarquía de clases de teléfonos: Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava TELEFONO •numero •marca •modelo llamar(numero) sonar() TELEFONO CELULAR •numero •marca •modelo llamar(numero) sonar() enviarMensaje(mensaje,numero) TELEFONO PUBLICO •numero •marca •modelo llamar(numero) recibirCredito(moneda) controlarCredito() TELEFONO •numero •marca •modelo llamar(numero) sonar() TELEFONO CELULAR •numero •marca •modelo llamar(numero) sonar() enviarMensaje(mensaje,numero) TELEFONO •numero •marca llamar(numero) sonar() TELEFONO PUBLICO •numero •marca •ubicacion llamar(numero) recibirCredito(moneda) controlarCredito() TELEFONO CELULAR •numero •marca •antena llamar(numero) sonar() enviarMensaje(mensaje,numero) Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava TELEFONO •numero •marca •modelo llamar(numero) sonar() TELEFONO CELULAR •numero •marca •modelo llamar(numero) sonar() enviarMensaje(mensaje,numero) TELEFONO PUBLICO •numero •marca •modelo llamar(numero) recibirCredito(moneda) controlarCredito() TELEFONO •numero •marca •modelo llamar(numero) sonar() TELEFONO CELULAR •numero •marca •modelo llamar(numero) sonar() enviarMensaje(mensaje,numero) TELEFONO •numero •marca llamar(numero) sonar() TELEFONO PUBLICO •ubicacion recibirCredito(moneda) controlarCredito() TELEFONO CELULAR •antena enviarMensaje(mensaje,numero) Herencia Ejemplo Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Resumiendo.... La herencia es un mecanismo propio de los lenguajes orientados a objetos, que: Permite recoger los aspectos comunes de dos o más clases de objetos con el máximo nivel de detalle (a nivel de atributo y de método). Permite que una subclase reutilice el código de una superclase, facilitando la creación de objetos a partir de objetos existentes. Ofrece la posibilidad de establecer tantos niveles de generalización o de especialización como sean necesarios para reflejar nuestro modelo de la realidad. Surge el concepto de jerarquía de clases. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Herencia Simple y Herencia Múltiple La herencia simple es aquella en la que cada subclase hereda de una única clase. En herencia simple, cada clase tiene un solo ascendiente y múltiples descendientes. La herencia múltiple es aquella en la que una subclase tiene múltiples superclases. JAVA soporta herencia simple. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Una subclase puede agregar atributos y comportamiento. Una subclase puede reemplazar o modificar el comportamiento heredado de su subclase, esto se llama sobreescritura. Aplicaciones de la herencia Variables y métodos de instancia comunes a todos los vehículos Variables y métodos de instancia ESPECÍFICOS de cada tipo de vehículo superclase subclases Es pe ci al iz ac ió n G enera lización Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Con la palabra clave extends ClaseA (clase base) ClaseB (clase derivada) ¿Cómo indicamos la relación de herencia en el código fuente Java? Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class Camion extends Vehiculo { private boolean tieneDobleCaja; private int cargaMaxima; public void setCargaMaxima(int cargaMaxima){ this.cargaMaxima = cargaMaxima; } public int getCargaMaxima() { return cargaMaxima; } . . . } Aplicaciones de la herencia public class Camioneta extends Vehiculos { private boolean tieneDobleCabina; private boolean es4x4; public void setTieneDobleCabina(boolean tieneDobleCabina) { this.tieneDobleCabina = tieneDobleCabina; } public boolean isTieneDobleCabina() { return tieneDobleCabina; } . . . } public class Auto extends Vehiculo { private Stringtipo; // sedan, familiar, etc. . . . } public class Vehiculo { private String marca; private double precio; . . . public void setMarca(String marca) { this.marca = marca; } public String getMarca() { return marca; } . . . } ¿Qué modificación deberíamos hacer para mantener información sobre la caja de cambios de las Camionetas, Autos y Camiones? Automáticamente, las subclases heredan las variables y métodos de la superclase Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Propio de la clase Auto Heredado de Vehículo Heredado de Object (el resto de los métodos) ¿Cómo nos muestra Eclipse los métodos propios y los heredados? Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Vehiculo miAuto = new Vehiculo(); ¿Qué puedo hacer sobre el objeto miAuto? Un objeto Camion es un Vehiculo Camion miCamion = new Camion(); ¿Qué puedo hacer sobre el objeto miCamion ? double p= miAuto.getPrecio(); String c= miAuto.getTipoCombustible(); if (miAuto.esUsado()) {.. .} double p= miCamion.getPrecio(); se pueden invocar a todos los métodos heredados de Vehiculo. if (miCamion.isTieneDobleCaja()) {.. .} también se pueden invocar a todos los métodos de Camion Métodos propios y heredados Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava La clase Camion hereda todos los atributos de Vehiculo y agrega dos, cargaMaxima y tieneDobleCaja y sobre- escribe el método detalles() Si una clase define un método de instancia con el mismo nombre, tipo de retorno y parámetros que uno de los métodos definidos en su superclase, dicho método sobrescribe al de la superclase. Sobreescritura Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class Test { public static void main(String args[]){ Vehiculo v = new Vehiculo(); v.setMarca("Ford"); v.setPrecio(12000.4); System.out.println(v.detalles()); Camion c = new Camion(); c.setMarca(“Scania"); c.setPrecio(35120.4); c.setCargaMaxima(3000); System.out.println(c.detalles()); } } public class Vehiculo { private String marca; private double precio; . . . public String detalles() { return “Vehiculo marca: "+getMarca() + "\n”+ "Precio: "+ getPrecio(); } // getters y setters } El método detalles() definido en la clase Vehiculo, se reemplazó o sobrescribió en la subclase Camion. Ejecutan métodos diferentes !! public class Camion extends Vehiculo { private boolean tieneDobleCaja; private int cargaMaxima; public String detalles() { return "Vehiculo marca: "+getMarca() + "\n"+"Precio: "+getPrecio() +"\n"+"carga máxima:"+getCargaMaxima(); } // getters y setters } SALIDA Sobreescritura Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class Camion extends Vehiculo { private boolean tieneDobleCaja; private int cargaMaxima; public String detalles() { return "Vehiculo marca: "+getMarca() + "\n"+"Precio: "+getPrecio() +"\n"+"carga máxima:"+getcargaMaxima(); } . } public class Vehiculo { private String marca; private double precio; . . . public String detalles() { return “Vehiculo marca: "+getMarca() + "\n” + "Precio: "+ getPrecio(); } . . . } ¿Es posible invocar al método detalles() de la clase Vehiculo desde un método de la clase Camion? SI!!!!! ¿Cómo? Usando la palabra clave super return super.detalles() + “\n” + “carga máxima:”+getCargaMaxima(); Sobreescritura y la palabra clave super Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Vehiculo vc = new Camion(); vc.detalles(); ¿Qué método detalle() se ejecuta? El asociado con el objeto “real”; al que hace referencia la variable en ejecución, un objeto Camion. Esta característica se llama binding dinámico y es propio de los lenguajes OO Vehiculo vc = new Camion(); vc.setMarca("Mercedes Benz"); vc.setPrecio(35120.4); vc.setCargaMaxima(3000); System.out.println(vc.detalles()); ¿Funciona? No está disponible para Vehiculo NO Compila upcasting El upcasting es seguro, la clase base tiene una interface pública que es igual o es un subconjunto de la clase derivada. Sobreescritura Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class Vehiculo extends Object{ private String marca; private double precio; . . . public String detalles() { return “Vehiculo marca: "+getMarca() + "\n”+"Precio: "+ getPrecio(); } . . . } public class Vehiculo { private String marca; private double precio; . . . public String detalles() { return “Vehiculo marca: "+getMarca() + "\n”+"Precio: "+ getPrecio(); } . . . } La clase Object es la superclase de todas las clases JAVA y está ubicada en el paquete java.lang Cuando se declara una clase sin usar la palabra clave extends el compilador JAVA implícitamente agrega el código extends Object a la declaración de la clase. Es equivalente a: De esta manera, estamos habilitados para sobreescribir los métodos heredados de Object. La clase Object Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava El método public boolean equals(Object obj){} compara la igualdad de 2 objetos. La versión original del método equals() devuelve true si las dos referencias son iguales, es decir si apuntan al mismo objeto en memoria. Es equivalente a usar el operador = =. El método public String toString(){} retorna un string formado por el nombre de la clase, seguido del símbolo @ más la representación hexadecimal del código hash del objeto sobre el que se invoca al método toString(). El objetivo del método equals(Object o) es comparar el contenido de dos objetos y la del método toString() es producir una representación textual, concisa, legible y expresiva del contenido del objeto. La clase Object Los métodos equals() y toString() public class Fecha { private int dia= 1; private int mes= 1; private int anio=2007; // métodos de instancia } Fecha f1 = new Fecha(); Fecha f2 = new Fecha(); f1.equals(f2); false f1==f2; false f1.toString(); Fecha@19821f 0x99f311 0x09a456f1 f2 Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class Fecha { private int dia = 1; private int mes = 1; private int año = 2006; public boolean equals(Object o){ boolean result=false; if ((o!=null) && (o instanceof Fecha)){ Fecha f=(Fecha)o; if ((f.getDia()==this.getDia()) &&(f.getMes()==this.getMes())&& (f.getAño()==this.getAño())) result=true; } return result; } public String toString(){ return getDia()+"-"+getMes()+"-"+getAño(); } . . . public static void main(String args[]){ Fecha f1, f2; f1 = new Fecha(); f2 = new Fecha(); System.out.println(f1==f2); System.out.println(f1.equals(f2)); System.out.println(f1.toString()); }} Es un operador que permite determinar la clase real del objeto La salida es: false true 1-1-2006 Ahora en la clase Fecha: El método equals(Object o) cumple su objetivo: comparar el contenido de dos objetos de tipo Fecha. Es por esta razón que frecuentemente se lo sobrescribe. El método toString() retorna un String con datos del objeto Fecha en una representación legible. La clase Object Los métodos equals() y toString() 0x99f311 0x09a456f1f2 Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura FavaProf. Laura Fava En JAVA podemos modelar un CONCEPTO ABSTRACTO mediante una clase abstracta cuya finalidad NO es crear instancias. Pensemos en una aplicación que dibuja figuras geométricas, podríamos dibujar por ejemplo: círculos, rectángulos, triángulos, líneas rectas, etc. Todas las figuras geométricas pueden cambiar de color, dibujarse en la pantalla, moverse, etc., pero cada una lo hace de una manera particular. Por otro lado, una figura geométrica, es un concepto abstracto, no es posible dibujarla o redimensionarla, sólo sabemos que todas las figuras geométricas concretas, como los círculos, rectángulos, triángulos tienen esas capacidades. Clases Abstractas Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class FiguraGeometrica { private Color color; private int x; private int y; public void mover(int x, int y){ this.x = x; this.y = y; } public void setColor(Color nuevoColor) { color = nuevoColor; dibujar(); } public void dibujar() { ?? } public int area(){ ?? } } La clase FiguraGeometrica NO representa una figura real, y por lo tanto NO puede definir implementaciones para todos sus métodos. ¿Qué hacemos? La declaramos abstracta Clases Abstractas Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava El objetivo de definir una clase abstracta es lograr una interface de comportamiento común para los objetos de las subclases (de la clase abstracta) . Se espera que una clase abstracta sea extendida por clases que implementen todos sus métodos abstractos. En una clase abstracta pueden existir métodos concretos y métodos abstractos. ¿Qué es un método abstracto? Es un método que NO tiene implementación. Se define el nombre, el tipo de retorno, la lista de argumentos, termina con “;” y se antepone la palabra clave abstract. NO tiene código. ¿Para qué sirve un método sin código? Para definir un comportamiento común para todos los objetos de las subclases concretas Clases Abstractas Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public abstract class FiguraGeometrica { // Color de la figura private Color color; private int x; private int y; public void mover(int x, int y){ this.x = x; this.y = y; } public void setColor(Color nuevoColor) { color = nuevoColor; dibujar(); } public abstract void dibujar(); } Para declarar una clase abstracta se antepone la palabra clave abstract a la palabra clave class. Una clase abstracta es una clase que solamente puede ser EXTENDIDA, no puede ser INSTANCIADA. public class TestFiguras { public static void main(String args[]){ new FigurasGeometricas(); } } Si se intenta crear objetos de una clase abstracta, fallará la compilación. El compilador NO permite crear instancias de clases abstractas. Los métodos abstractos no tiene cuerpo, su declaración termina con “;” Una clase abstracta puede contener métodos abstractos y métodos concretos. Clases Abstractas Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava métodos abstractos clase abstracta clases concretas FiguraGeometrica es una clase abstracta y los métodos area() y dibujar() son abstractos. Para que las subclases Rectangulo, Rombo y Circulo sean concretas, deben proveer una implementación de cada uno de los método abstractos de la clase FiguraGeometrica. Las clases abstractas pueden declarar variables de instancia Las clases abstractas pueden declarar métodos concretos métodos concretos Clases Abstractas y Herencia Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Polimorfismo Herencia y Upcasting Lo más interesante de la herencia es la relación entre la clase derivada y la clase base: “la clase derivada es un tipo de la clase base” (es-un o es-como-un). Upcasting es la conversión de una referencia de un objeto de la clase derivada en una referencia de un objeto de la clase base. El upcasting es seguro: la clase derivada es un super conjunto de la clase base, podría contener más métodos que la clase base, pero seguro contiene los métodos de la clase base. Upcasting o casting ascendente Acepta como parámetro una referencia a un Instrumento o a cualquier derivado de Instrumento public abstract class InstrumentoMusical{ public abstract void tocar(Nota n); } public class Vientos extends InstrumentoMusical{ public void tocar(Nota n) { System.out.print(“Vientos.tocar(): ”+n); }} public class CancionSimple { Nota[] pentagrama = new Nota[100]; public void sonar(InstrumentoMusical i){ for (Nota n:pentagrama) i.tocar(n); } public static void main(String[] args) { CancionSimple cs = new CancionSimple(); Vientos flauta = new Vientos(); cs.sonar(flauta); } } Se pasa como parámetro una referencia a un objeto Vientos sin necesidad de hacer casting, se hace un upcasting automático. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Otra solución: sonar() es un método sobrecargado que tiene como argumento un objeto de tipo Vientos o Cuerdas en vez de un objeto InstrumentoMusical. ¿Es una buena solución? public class CancionSimple { Nota[] pentagrama = new Nota[100]; public void sonar(Vientos i){ for (Nota n:pentagrama) i.tocar(n); } public static void main(String[] args){ CancionSimple cs = new CancionSimple(); Vientos flauta = new Vientos(); cs.sonar(flauta); } } Polimorfismo public void sonar(Cuerdas i){ for (Nota n:pentagrama) i.tocar(n); } El polimorfismo permite escribir código que “hable” con la clase base y las clases derivadas. public class CancionSimple { Nota[] pentagrama = new Nota[100]; public void sonar(InstrumentoMusical i){ for (Nota n:pentagrama) i.tocar(n); } public static void main(String[] args) { CancionSimple cs = new CancionSimple(); Vientos flauta=new Vientos(); cs.sonar(flauta); Cuerdas guitarra=new Cuerdas(); cs.sonar(guitarra); } } Solución apropiada se hace un upcasting automáticoCuerdas piano = new Cuerdas(); cs.sonar(piano); Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava public class CancionSimple { Nota[] pentagrama = new Nota[100]; public void sonar(InstrumentoMusical i){ for (Nota n:pentagrama) i.tocar(n); } public static void main(String[] args) { CancionSimple cs = new CancionSimple(); if (args[0].equals(“V”)) Vientos ins=new Vientos(); else Cuerdas ins=new Cuerdas(); cs.sonar(ins); }} ¿Puede el compilador java saber que el objeto InstrumentoMusical pasado como parámetro en sonar() es una referencia a un objeto Vientos o Cuerdas? m1(){} m2(){} m3(){} main(){ m1(); m2(); . . . } Conectar la invocación de un método con el cuerpo del método, se llama binding. Si el binding, se hace en compilación, se llama Binding temprano (early binding) y si se hace en ejecución binding tardío (early binding) o binding dinámico (dynamic binding). Binding temprano En compilación se resuelven todas las invocaciones a métodos m2() ...... ...... m1() ...... ......compilador . . . . . . llamada a m1() llamada a m2() . . . . . . Código fuente Código compilado Binding Dinámico El compilador no conoce qué método invocará cuando recibe la referencia a un objetoInstrumentoMusical. El binding se resuelve en ejecución. Polimorfismo y Binding Dinámico NO!! No hay manera de saber, mirando el código, que tipo de instrumento ejecutará el tocar(), eso depende del valor que tome la variable i en ejecución. Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava • Java usa binding dinámico: la resolución de las invocaciones a métodos, se hace en ejecución (run-time), basándose en el tipo del objeto receptor. • Java provee un mecanismo para determinar en ejecución el tipo del objeto receptor e invocar al método apropiado. • Aprovechando que java usa binding dinámico, el programador puede escribir código que hable con la clase base, conociendo que las clases derivadas funcionarán correctamente usando el mismo código. Polimorfismo y Binding Dinámico • El polimorfismo promueve la construcción de código extensible: un programador podría agregar subclases a InstrumentoMusical sin tocar el método sonar(InstrumentoMusical i). Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava Polimorfismo y Binding Dinámico El polimorfismo significa “diferentes formas”. En POO se tiene una interface común en la clase base y diferentes versiones de métodos ligados dinámicamente: binding dinámico. package polimorfismo; public class CancionSimple { private Nota[] pentagrama = new Nota[100]; public void sonar(InstrumentoMusical i) { for (Nota n: pentagrama) i.tocar(n); } public static void main(String[] args) { CancionSimple cs = new CancionSimple(); InstrumentoMusical[] m={new Viento(), new Cuerdas(),new Percusion(),new Saxo()}; for (int i=0;i<m.length;i++) cs.sonar(m[i]); } } El binding dinámico resuelve a que método invocar, cuando más de una clase en una jerarquía de herencia implementó un método (en este caso tocar()). La JVM busca la implementación de los métodos invocados de acuerdo al tipo del objeto receptor en tiempo de ejecución. Binding dinámico. La declaración del tipo de la variable (InstrumentoMusical) es utilizada por el compilador de java para chequeo de errores durante la fase de compilación, pero el compilador no puede resolver qué método que se ejecutará. Si se agregan nuevas clases a la jerarquía de herencia el método sonar(InstrumentoMucical i), no se ve afectado esto es lo que provee el polimorfismo. upcasting automático a InstrumentoMusical. Taller de Lenguajes II – Prof. Queiruga y Prof. Fava – Año 2011 Página 1 Página 2 Página 3 Página 4 Página 5 Página 6 Página 7 Página 8 Página 9 Página 10 Página 11 Página 12 Página 13 Página 14 Página 15 Página 16 Página 17 Página 18 Página 19 Página 20 Página 21 Página 22 Página 23 Página 24 Página 25 Página 26 Página 27 Página 28 Página 29 Página 30 Página 31 Página 32 Página 33 Página 34 Página 35
Compartir