Documente Academic
Documente Profesional
Documente Cultură
Clases y Objetos
POLIMORFISMO
Descripción:
Es la capacidad de tener métodos con el mismo nombre y diferente implementación.
Uno de los objetivos principales de las técnicas OO es utilizar una y otra vez el mismo código.
Sin embargo, algunas de las operaciones requieren adaptación para resolver necesidades
particulares. Esta necesidad, se da generalmente entre superclases y subclases, donde una
subclase es una especialización de su superclase, y puede requerir alcanzar los mismos
objetivos, pero con distintos mecanismos. Por ejemplo, una superclase Rectángulo podría
tener una operación calculoArea() cuyo objetivo es calcular el área del rectángulo, definida
como la multiplicación de las longitudes de dos lados contiguos. A su vez, la clase Cuadrado
es una subclase de Rectángulo que también tiene una operación calculoArea() cuyo objetivo
es calcular el área del cuadrado, pero que está definida especialmente para los objetos del
tipo cuadrado como la multiplicación de la longitud de uno de sus lados por si mismo. Este
fenómeno, polimorfismo, se aplica a una operación que adopta varias formas de implantación
según el tipo de objeto, pero cumple siempre el mismo objetivo.
Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una operación
sin conocer el método que debe ser llamado. Estos detalles de la implantación quedan ocultos
para el usuario y la responsabilidad descansa en el mecanismo de selección de la
implantación. Por ejemplo, al tratar de frenar un vehículo siempre se debe oprimir el pedal
del lado izquierdo y así el vehículo se detendrá sin importar si los frenos son de tambor o de
aire.
Polimorfismo significa múltiples formas; en programación orientada por objetos esto significa
que una operación puede tener más de un método que la implementa. La propiedad de
polimorfismo permite que cuando se envía un mensaje a un objeto, sólo se decida en tiempo
de ejecución que método se invoca. Este concepto se conoce como encadenamiento tardío. En
lenguajes tradicionales estructurados se hace el encadenamiento temprano, lo que significa
que el encadenador sabe resolver todos los llamados a rutinas en tiempo de
compilación/encadenamiento.
import java.util.*;
class Instrumento {
// Un tipo de Guitarra
class Guzla extends Guitarra {
// Un tipo de Guitarra
class Ukelele extends Guitarra {
Clase Musica
En el código fuente de Musica.java son diseñadas diversas Clases que demuestran el uso de
Polimorfismo:
Instrumento: Es utilizada como la Clase Base para el resto de Clases y en ella son
definidos tres métodos: tocar, tipo y afinar.
Guitarra: Hereda ("Inherit") de la Clase Instrumento y redefine ("Override") los métodos
de ésta.
Las definiciones de la Clase principal Musica son descritas en los siguientes incisos:
El primer método definido en esta Clase llamado afinar toma como valor de entrada
una referencia del tipo Instrumento, sobre la cual es invocado el método tocar.
Un segundo método nombrado afinarTodo toma como valor de inicia un arreglo de
Instrumento, el cual es procesado por un ciclo que a su vez manda llamar el método afinar
con los respectivos valores del arreglo.
Dentro del método principal se define lo siguiente:
Primeramente se genera un arreglo de Instrumento para 5 Objetos.
Se inicializa un entero i con un valor de cero.
A través de la referencia orquesta son asignados distintos Objetos al arreglo,
nótese que aunque el arreglo es de tipo Instrumento es posible asignar los Objetos:
Guitarra, Piano, Saxofon, Guzla, Ukelele.
Finalmente se invoca el método afinarTodo con la referencia que representa el
arreglo de Instrumento.
Guitarra.tocar()
Piano.tocar()
Saxofon.tocar()
Guzla.tocar()
Ukelele.tocar()
Sin embargo, al ser invocado el método tocar a pesar de ser a través de una referencia
Instrumento es invocado el método de Clase acordemente, esto es, se llama el método de la
Clase especifica; lo anterior es una labor de Polimorfismo ya que ocurre el comportamiento
adecuado a pesar de realizarse las llamadas a través de una clase general (Instrumento).
Clase jclsFiguraGeometrica
package jpackClases;
import java.awt.*;
public jclsFiguraGeometrica() {
nombre = "Figura";
fuente = new Font("ARIAL",Font.BOLD,30);
}
Clase jclsCirculo
package jpackClases;
import java.awt.*;
import java.awt.geom.*;
g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}
Clase jclsRectangulo
package jpackClases;
import java.awt.*;
import java.awt.geom.*;
g2.setColor(Color.yellow);
g2.fill(new Rectangle2D.Double(x,y,ancho,alto));
g2.setColor(Color.red);
g2.draw(new Rectangle2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("RECTANGULO",x+50,y+50);
}
}
Clase jpanDibujo
package jpackClases;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public jpanDibujo() {
nombre = "CIRCULO";
}
Clase jclsInicio
package jpackGUI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import jpackClases.jpanDibujo;
import jpackClases.*;
public jclsInicio() {
this.setTitle("Guia 7: Polimorfismo");
this.setSize(600,400);
this.setLocation(100,50);
this.setVisible(true);
this.setIconImage(new ImageIcon("src\\jpackImagenes\\bandera.gif").getImage());
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
preparBarraMenu();
prepararPanelFondo();
prepararPanelLimpiar();
prepararPanelDibujo();
}
jmnuArchivo.setMnemonic('A');
jmnuPoligono.setMnemonic('P');
jmnubBarra.setBackground(Color.yellow);
jmnuArchivo.setForeground(Color.blue);
jmnuPoligono.setForeground(Color.blue);
jmnuiIniciar.setBackground(Color.yellow);
jmnuiIniciar.setForeground(Color.blue);
jmnuiCerrar.setBackground(Color.yellow);
jmnuiCerrar.setForeground(Color.red);
jmnuiSalir.setBackground(Color.white);
jmnuiSalir.setForeground(Color.black);
jmnuiRect.setBackground(Color.yellow);
jmnuiRect.setForeground(Color.blue);
jmnuiCir.setBackground(Color.yellow);
jmnuiCir.setForeground(Color.blue);
jmnuPoligono.setEnabled(false);
jmnuiCerrar.setEnabled(false);
jmnuiIniciar.addActionListener(this);
jmnuiCerrar.addActionListener(this);
jmnuiSalir.addActionListener(this);
jmnuiRect.addActionListener(this);
jmnuiCir.addActionListener(this);
jmnuArchivo.add(jmnuiIniciar);
jmnuArchivo.add(jmnuiCerrar);
jmnuArchivo.add(jsep1);
jmnuArchivo.add(jmnuiSalir);
jmnuPoligono.add(jmnuiRect);
jmnuPoligono.add(jmnuiCir);
jmnubBarra.add(jmnuArchivo);
jmnubBarra.add(jmnuPoligono);
this.setJMenuBar(jmnubBarra);
}
this.add(jpanFondo);
}
jpanFondo.add(jpanLimpiar,"Limpiar");
}
if(e.getSource()==jmnuiIniciar){
jmnuPoligono.setEnabled(true);
jmnuiIniciar.setEnabled(false);
jmnuiCerrar.setEnabled(true);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}
if(e.getSource()==jmnuiCerrar){
jmnuPoligono.setEnabled(false);
jmnuiIniciar.setEnabled(true);
jmnuiCerrar.setEnabled(false);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}
if(e.getSource()==jmnuiSalir){
System.exit(0);
}
if(e.getSource()==jmnuiRect){
jclsRectangulo R = new jclsRectangulo(50,50,400,250);
jpanDibu.setFigura(R);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiCir){
jclsCirculo C = new jclsCirculo(50,50,250,250);
jpanDibu.setFigura(C);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
}
Interface Objeto
package jpackClases;
import java.awt.*;
Clase Persona
package jpackClases;
import java.awt.*;
public Persona() {
nombre = "Persona";
fuente = new Font("ARIAL",Font.BOLD,30);
}
Clase Cantante
package jpackClases;
import java.awt.*;
Clase Futbolista
package jpackClases;
import java.awt.*;
Clase Modelo
package jpackClases;
import java.awt.*;
Clase Tablista
package jpackClases;
import java.awt.*;
g.drawString(nombre,50,50);
}
package jpackClases;
import java.awt.*;
public jclsFiguraGeometrica() {
nombre = "Figura";
fuente = new Font("ARIAL",Font.BOLD,30);
}
}
}
Clase jclsCirculo
package jpackClases;
import java.awt.*;
import java.awt.geom.*;
g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}
Clase jclsRectangulo
package jpackClases;
import java.awt.*;
import java.awt.geom.*;
g2.setColor(Color.yellow);
g2.fill(new Rectangle2D.Double(x,y,ancho,alto));
g2.setColor(Color.red);
g2.draw(new Rectangle2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("RECTANGULO",x+50,y+50);
}
g2.setColor(Color.green);
g2.fill(new Ellipse2D.Double(x,y,ancho,alto));
g2.setColor(Color.blue);
g2.draw(new Ellipse2D.Double(x,y,ancho,alto));
g2.setFont(fuente);
g2.drawString("CIRCULO",x+55,y+50);
}
}
Clase jpanDibujo
package jpackClases;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public jpanDibujo() {
nombre = "CIRCULO";
}
Clase jclsInicio
package jpackGUI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import jpackClases.jpanDibujo;
import jpackClases.*;
public jclsInicio() {
this.setTitle("Guia 7: Polimorfismo");
this.setSize(600,400);
this.setLocation(100,50);
this.setVisible(true);
this.setIconImage(new ImageIcon("src\\jpackImagenes\\bandera.gif").getImage());
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
preparBarraMenu();
prepararPanelFondo();
prepararPanelLimpiar();
prepararPanelDibujo();
}
jmnuArchivo.setMnemonic('A');
jmnuPoligono.setMnemonic('o');
jmnuPersona.setMnemonic('e');
jmnubBarra.setBackground(Color.yellow);
jmnuArchivo.setForeground(Color.blue);
jmnuPoligono.setForeground(Color.blue);
jmnuPersona.setForeground(Color.blue);
jmnuiIniciar.setBackground(Color.yellow);
jmnuiIniciar.setForeground(Color.blue);
jmnuiCerrar.setBackground(Color.yellow);
jmnuiCerrar.setForeground(Color.red);
jmnuiSalir.setBackground(Color.white);
jmnuiSalir.setForeground(Color.black);
jmnuiRect.setBackground(Color.yellow);
jmnuiRect.setForeground(Color.blue);
jmnuiCir.setBackground(Color.yellow);
jmnuiCir.setForeground(Color.blue);
jmnuH.setForeground(Color.blue);
jmnuM.setForeground(Color.blue);
jmnuiH1.setBackground(Color.yellow);
jmnuiH1.setForeground(Color.blue);
jmnuiH2.setBackground(Color.yellow);
jmnuiH2.setForeground(Color.blue);
jmnuiM1.setBackground(Color.yellow);
jmnuiM1.setForeground(Color.blue);
jmnuiM2.setBackground(Color.yellow);
jmnuiM2.setForeground(Color.blue);
jmnuPersona.setEnabled(false);
jmnuPoligono.setEnabled(false);
jmnuiCerrar.setEnabled(false);
jmnuiIniciar.addActionListener(this);
jmnuiCerrar.addActionListener(this);
jmnuiSalir.addActionListener(this);
jmnuiRect.addActionListener(this);
jmnuiCir.addActionListener(this);
jmnuiH1.addActionListener(this);
jmnuiH2.addActionListener(this);
jmnuiM1.addActionListener(this);
jmnuiM2.addActionListener(this);
jmnuArchivo.add(jmnuiIniciar);
jmnuArchivo.add(jmnuiCerrar);
jmnuArchivo.add(jsep1);
jmnuArchivo.add(jmnuiSalir);
jmnuPoligono.add(jmnuiRect);
jmnuPoligono.add(jmnuiCir);
jmnuPersona.add(jmnuH);
jmnuPersona.add(jmnuM);
jmnuH.add(jmnuiH1);
jmnuH.add(jmnuiH2);
jmnuM.add(jmnuiM1);
jmnuM.add(jmnuiM2);
jmnubBarra.add(jmnuArchivo);
jmnubBarra.add(jmnuPoligono);
jmnubBarra.add(jmnuPersona);
this.setJMenuBar(jmnubBarra);
}
this.add(jpanFondo);
}
jpanFondo.add(jpanLimpiar,"Limpiar");
}
if(e.getSource()==jmnuiIniciar){
jmnuPersona.setEnabled(true);
jmnuPoligono.setEnabled(true);
jmnuiIniciar.setEnabled(false);
jmnuiCerrar.setEnabled(true);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}
if(e.getSource()==jmnuiCerrar){
jmnuPersona.setEnabled(false);
jmnuPoligono.setEnabled(false);
jmnuiIniciar.setEnabled(true);
jmnuiCerrar.setEnabled(false);
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Limpiar");
}
if(e.getSource()==jmnuiSalir){
System.exit(0);
}
if(e.getSource()==jmnuiRect){
jclsRectangulo R = new jclsRectangulo(50,50,400,250);
jpanDibu.setObjeto(R);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiCir){
jclsCirculo C = new jclsCirculo(50,50,250,250);
jpanDibu.setObjeto(C);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiH1){
Futbolista Futbol = new Futbolista("Paolo Guerrero");
jpanDibu.setObjeto(Futbol);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiH2){
Cantante Canta = new Cantante("Pedro Suarez Vertiz");
jpanDibu.setObjeto(Canta);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiM1){
Modelo Mode = new Modelo("María Julia Mantilla");
jpanDibu.setObjeto(Mode);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}
if(e.getSource()==jmnuiM2){
Tablista Tabla = new Tablista("Sofía Mulanovich");
jpanDibu.setObjeto(Tabla);
jpanDibu.repaint();
((CardLayout)jpanFondo.getLayout()).show(jpanFondo,"Dibujo");
}