Pensando en Java

Page 2

class Note { private int value; private Note(int val) { value = val; } public static final Note middleC = new Note(0), cSharp = new Note(1), cFlat = new Note(2); } // Etc. class Instrument { public void play(Note n) { System.out.println("Instrument.play()"); } } // Wind objects are instruments // because they have the same interface: class Wind extends Instrument { // Redefine interface method: public void play(Note n) { System.out.println("Wind.play()"); } } public class Music { public static void tune(Instrument i) { // ... i.play(Note.middleC); } public static void main(String[] args) { Wind flute = new Wind(); tune(flute); // Upcasting } } ///:~ El método Music.tune() acepta un manejador instrumental , pero también cualquier tipo derivado de un instrumento. En la función main() podemos ver como se pasa el manejador Wind al método tune() sin necesidad de cast. Esto es aceptable; en Wind debe existir el interface de Instrument , ya que Wind lo hereda de él. La conversión hacia arriba desde Wind hacia Instrument puede "estrechar" el interfaz, pero no puede hacer nada menos el interface completo de Instrument .

¿Por qué upcast? Este programa puede parecer extraño. ¿Por qué debe alguien olvidar intencionadamente el tipo de un objeto? Esto es lo que sucede cuando se realiza el


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.