Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ndice
4.
Sobre el captulo
Motivaciones
La herencia ha sido y es un canto de sirena en los objetos. Quien lo
escucha con odos ingenuos se hunde con el sistema. Parece que la
herencia es la fuente de ahorro de cdigo, de la facilidad de modificacin
y extensin de los programas, pero realmente es lo contrario, salvo que
se utilice con el papel y la forma adecuada. El papel adecuado de la
herencia es como medio de aumento de la ambigedad y la forma
adecuada de uso es mediante el polimorfismo.
Objetivo
El objetivo del presente captulo es que los alumnos comprendan:
1 El concepto de herencia, su papel favorable y sus papeles
perjudiciales
2 El concepto de polimorfismo
3 Que es mejor delegar que heredar
4 El principio de sustitucin de Liskov, como forma segura y
til de la herencia
5 Las clases abstractas
6 Que la ambigedad es la clave, no la divisin
Contenido
La primera parte profundiza en la herencia, sus aspectos buenos y
malos, y recomienda que es preferible delegar que heredar. Se enuncia
tambin el concepto de polimorfismo.
La segunda parte estudia con detalle el principio de sustitucin de
Liskov, sus condiciones y cmo un cuadrado no es un rectngulo, en
trminos de la herencia software.
La tercera parte se dedica a las clases abstractas; a la ambigedad
como solucin de la diversidad y, en general, como solucin ms
poderosa que el limitado principio de divide y vencers.
La cuarta parte discute la herencia mltiple, sus efectos nefastos
actuales y las restrictivas condiciones donde es favorable, por ejemplo,
en el patrn adaptador.
1 La herencia
La herencia es uno de los cantos de sirenas del enfoque de
objetos. Se dice mucho de sus favores y muy poco de sus peligros. Por
esta causa primero se estudiar la definicin y los peligros, y despus se
ver la forma de obtener los favores de la herencia.
Desde el punto de vista formal, [Booch 94] establece que:
La herencia es una relacin entre clases donde una clase comparte
la estructura o comportamiento definido en otra clase (herencia
simple) o en ms clases (herencia mltiple). La herencia define
una jerarqua es-un entre clases, en la cual una subclase hereda
de una o ms clases generalizadas; una subclase tpicamente
especializa su superclase aadiendo o redefiniendo la estructura y
el comportamiento.
La Figura 4. 1 ilustra el mecanismo de herencia simple.
Figura 4. 1 La herencia
2 El polimorfismo
El polimorfismo es una de las cualidades importantes del enfoque
de objetos por su aporte de ambigedad en el diseo. Est asociado con
el mecanismo de herencia y permite que la operacin definida por una
misma cabecera (signatura) sea implementada de maneras distintas.
Se denomina polimorfismo a la capacidad de una operacin para
manifestar un comportamiento diferente dependiendo del objeto
que la ejecuta. Por ejemplo, la operacin m2 es polimrfica porque
su comportamiento depende de si la ejecuta un objeto de la clase
A o un objeto de la clase B.
declaracin de la variable v
se asigna a la variable v un objeto de la clase A
mensaje al objeto asignado a v para que ejecute m2
declaracin de la variable v
se asigna a la variable v un objeto de la clase C
mensaje al objeto asignado a v para que ejecute m2
declaracin de la variable v
se asigna a la variable v un objeto de la clase B
mensaje al objeto asignado a v para que ejecute m2
declaracin de la variable v
se asigna a la variable v un objeto de la clase C
mensaje al objeto asignado a v para que ejecute m2
simple
se
corresponde
con
el
fenmeno
biolgico
denominado
(hijas,
nietas,
choznas,)
nacidas
por
nacer
parte
de
persona
es
la
situacin
de
cliente)
reduce
los
puede
usar
los
servicios
de
todos
los
subtipos
de
A,
tendr
dos
atributos,
largo
ancho,
un
mtodo
Preguntmonos
ahora
que ocurrira
si
sustituimos
la
clase
facilitar que la clase Figura sea el tipo de todas las clases de figuras
conviene prescindir de atributos restrictivos, conviene elevar su
capacidad de expresar ambigedad.
solucin
alternativa
al
problema
de
los
cuadrados
la
clase
por
estas
dos
causas
es
ms
susceptible
equivocaciones.
La clase Figura* es una clase concreta que implementa una
herramienta general. Es como una piedra que sirve para clavar, cortar,
lanzar, dibujar, calzar,segn se use. Hay que soportar un peso
innecesario cuando se usa para cortar y hay que tener cuidado de no
cortarse, al usar la piedra para clavar. Adems, cuando se trate de
mejorar alguno de sus usos, se puede perjudicar otro porque todos ellos
estn
muy
ligados,
en
la
misma
piedra.
Los
humanos
fueron
especializando
los
distintos
usos
de
la
piedra
en
instrumentos
travs
de
sus
recursos
para
expresar
manejar
ambigedad
que
expresa
la
abstraccin
simplifica
la
17 La herencia mltiple
Hasta ahora se ha estudiado la herencia simple de un solo
progenitor (partenogentica), pero tambin existe la herencia de varios
progenitores.
Se denomina herencia mltiple a la herencia donde una subclase
tiene ms de una superclase directa. La Figura 4. 13 ilustra la herencia
mltiple.
Figura 4. 13 Herencia mltiple
la
herencia
es
un
mecanismo
esttico
(en
tiempo
de
compilacin).
Si el mecanismo hereditario fuese dinmico, en tiempo de
ejecucin, un objeto pudiera ser de una clase ahora y de otra despus.
No habra confusiones porque no sera de dos clases en el mismo
momento. Aunque los lenguajes comerciales de programacin orientada
a objetos todava no incorporan una herencia dinmica, es posible
conseguir efectos semejantes con algunas tcnicas, referidas por [Fowler
97].
Otro
problema
es
solapamiento
del
contenido
gentico
no
coincidieran
sera
posible
aplicar
una
tcnica
de
Rectngulo.
Pero
como
todos
comparten
la
misma
20 El polimorfismo en Java
Veamos cmo se implementa el polimorfismo en el lenguaje Java.
A continuacin mostramos el cdigo de las clases Ventana, Figura,
Crculo, Tringulo y Rectngulo del
Declaramos en ventana el
atributo figura de la clase
Figura
private JButton circulo, rectangulo, triangulo, ampliar, reducir, arriba, abajo, izqda, dcha;
public Ventana() {
//Pintar la ventana vaca
setTitle("Pintar Figuras");
asignarLookAndFeel();
setCloseClick();
setExtendedState(MAXIMIZED_BOTH);
configurarGUI();
//Repintar la ventana con la figura
pack();
setExtendedState(MAXIMIZED_BOTH);
setVisible(true);
}
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{System.exit(0);}
});
}
private void configurarGUI(){
//Crear los paneles de botones de figuras y operaciones
panelfiguras = new JPanel();
panelfiguras.setLayout(new GridLayout());
paneloperaciones = new JPanel();
paneloperaciones.setLayout(new GridLayout());
//Crear los botones de figuras y aadirlos al panel de figuras
circulo=new JButton("Pintar Circulo");
circulo.addActionListener(this);
panelfiguras.add(circulo);
rectangulo=new JButton("Pintar Rectangulo");
rectangulo.addActionListener(this);
panelfiguras.add(rectangulo);
triangulo=new JButton("Pintar Triangulo");
triangulo.addActionListener(this);
panelfiguras.add(triangulo);
//Crear los botones de operaciones y aadirlos al panel de operaciones
//Tienen que estar inhabilitados hasta que se haya elegido una figura
ampliar=new JButton("Ampliar");
ampliar.addActionListener(this);
ampliar.setEnabled(false);
paneloperaciones.add(ampliar);
reducir=new JButton("Reducir");
reducir.addActionListener(this);
reducir.setEnabled(false);
paneloperaciones.add(reducir);
arriba=new JButton("Mover arriba");
arriba.addActionListener(this);
arriba.setEnabled(false);
paneloperaciones.add(arriba);
abajo=new JButton("Mover abajo");
abajo.addActionListener(this);
abajo.setEnabled(false);
paneloperaciones.add(abajo);
izqda=new JButton("Mover izqda");
izqda.addActionListener(this);
izqda.setEnabled(false);
paneloperaciones.add(izqda);
dcha=new JButton("Mover dcha");
dcha.addActionListener(this);
dcha.setEnabled(false);
paneloperaciones.add(dcha);
El mtodo paint debera ser abstracto, pero para poder utilizar el API swing necesitamos que est implementado en todas las cl
}
public abstract class Figura extends JPanel{
protected Color color;
protected boolean haydatos=false;
public Figura() {
}
public void paint(Graphics g){
super.paint(g);
}
}
public void paint (Graphics g)
Declaramos la clase Rectngulo que hereda de Figura
{
super.paint(g);
//Si el usuario ha introducido los datos pinta el circulo
if (haydatos){
g.setColor(color);
g.drawOval(centrox-radio, centroy-radio,2*radio,2*radio);
g.fillOval(centrox-radio, centroy-radio,2*radio,2*radio);
g.dispose();
}
}
//Altura
private int altura;
Implementamos el mtodo ampliar
//Crea una nueva instancia de Rectangulo
public Rectangulo() {
// Mostrar el formulario para obtener los datos del rectangulo
FormularioRectangulo formulario= new FormularioRectangulo();
JDialog dialog =new JDialog();
dialog.setTitle("Introduzca los datos del rectangulo");
dialog.setModal(true);
Implementamos el mtodo reducir
dialog.setContentPane(formulario);
dialog.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);
dialog.pack();
dialog.show();
// Obtener los datos introducidos por el usuario
origenx=formulario.obtenerOrigenx();
origeny=formulario.obtenerOrigeny();
base=formulario.obtenerBase();
altura=formulario.obtenerAltura();
color=formulario.obtenerColor();
haydatos=true;
}
public void paint(Graphics g) {
super.paint(g);
//Si el usuario ha introducido los datos pinta el rectangulo
if (haydatos){
g.setColor(color);
g.drawRect(origenx,origeny,base,altura);
g.fillRect(origenx,origeny,base,altura);
g.dispose();
}
}
public void mover (int desplazamientox, int desplazamientoy){
origenx=origenx+desplazamientox;
origeny=origeny+desplazamientoy;
}
}
public void reducir (int zoomout){
if (zoomout > 0){
base= base / zoomout;
altura=altura / zoomout;
}
}
}
public class Triangulo extends Figura{
//Coordenada x del vertice superior
private int verticesuperiorx;
//Coordenada y del vertice superior
private int verticesuperiory;
//Base
private int base;
//Altura
private int altura;
21 Ejercicio
Reutilice el la solucin de figuras geomtricas para dibujar una
cara. El aspecto de la cara se muestra a continuacin. Puede suponer
que el contorno de la cara es un crculo, que los ojos tambin son
crculos y que la boca es un rectngulo muy estrecho.
Una solucin
Pensar en objetos es asociar a un objeto la tarea de dibujar la cara.
Sera un objeto compuesto de otros objetos; uno por cada componente
de la cara. Por ejemplo:
22 Otro ejercicio
La cara que pintamos no les gust a los nios y propusieron que el
contorno fuese un cuadrado. Haga las modificaciones necesarias en el
diseo para satisfacer la nueva solicitud. De paso, evale la facilidad
que ofrece su diseo anterior para ajustarse a este cambio.
Bibliografa
[Booch 94] Grady Booch, Object Oriented Analysis and Design Ed.
Benjamin Cummings Publishing, 1994