Você está na página 1de 9

UNIDAD IV POLIMORFISMO

4.1 Definicin. 4.2 Clases abstractas: definicin, mtodos abstractos, implementacin de clases abstractas, modelado de clases abstractas. 4.3 Interfaces: definicin, implementacin de interfaces, herencia de interfaces. 4.4 Variables polimrficas (plantillas): definicin, uso y aplicaciones. 4.5 Reutilizacin de cdigo.

CONCEPTO DE POLIMORFISMO La palabra polimorfismo tiene su origen en las palabras griegas poli ( muchos ) y morfos ( formas ) y se utiliza para indicar que un mismo mensaje enviado a diferentes objetos producir muchas formas de respuesta. Por ejemplo, si tenemos la clase base Figura y de ella derivan las clases Rectngulo y Elipse. Suponiendo que las tres tienen declarado el mtodo daArea( ), entonces podemos tener objetos de las clases derivadas ( Rectngulo y Elipse) referenciados como si fueran de la clase base (Figura) y despus enviarles mensajes para que devuelvan su rea. El polimorfismo puede considerarse como la caracterstica ms potente de los lenguajes orientados a objetos, despus de su capacidad para soportar la abstraccin. Existe polimorfismo cuando interactan las caractersticas de herencia y enlace dinmico.

Enlace esttico y enlace dinmico. El enlace estatico ( denominado tambin enlace temprano ) consiste en la asignacin esttica de tipos a todas las variables y expresiones en tiempo de compilacin. El enlace dinmico ( denominado tambin enlace tardo ) consiste en asignar los tipos a las variables y expresiones en tiempo de ejecucin.

4.2 CLASES ABSTRACTAS: definicin, mtodos abstractos, implementacin de clases abstractas, modelado de clases abstractas Clases abstractas Cuando pensamos en una clase como un tipo, asumimos que los programas crearn objetos de ese tipo. Sin embargo, hay casos en que es til definir clases para las cuales no se desea instanciar objetos. Tales clases son llamadas clases abstractas. Debido a que normalmente son utilizadas como base en jerarquas de clases, nos referiremos a ellas como clases base abstractas. Las clases abstractas no sirven para instanciar objetos porque estn incompletas, siendo sus clases derivadas las que debern definir las partes faltantes. El propsito de una clase abstracta es proveer una clase base apropiada desde la cual otras clases hereden. Las clases desde las cuales se pueden instanciar objetos se llaman clases concretas. Tales clases proveen implementaciones de cada mtodo o propiedad que definen. Las clases abstractas normalmente contienen uno o ms mtodos o propiedades abstractas, las cuales no proveen implementacin. Las clases derivadas deben reemplazar los mtodos abstractos heredados para permitir la instanciacin de objetos.

6.2.1.- Definicin. Para definir una clase abstracta se utiliza la palabra clave abstract (que tambin sirve para definir mtodos y propiedades abstractos). abstract class NombreClase{//} Ejemplo : // Clase abstracta con mtodos abstractos; abstract class Figura

{ protected int x, y ; public abstract double daPermetro( ) ; // Declaracin de un mtodo abstracto. public abstract double daArea( ) ; // Declaracin de un mtodo abstracto. } Intentar construir objetos de la clase Figura producir un error de compilacin. Las clases abstractas pueden definir mtodos y variables instancia, y normalmente tiene mtodos abstractos. El lenguaje Java obliga a que si una clase tiene un mtodo abstracto la clase se declare abstracta.

Una caracterstica importante es que no se puede definir objetos, instanciar, de una clase abstracta. Conceptualmente es una contradiccin, adems el compilador da un error siempre que se intenta crear un objeto de una clase abstracta. public abstrac class Metal {}

Metal mer= new Metal(); //

// error: no se puede instanciar de clase abstracta

No se pueden crear objetos, pero si se definen variables de una clase abstracta. Como stas estn en lo ms alto de la jerarqua de clases, son superclases base, hay una conversin automtica de referencias a clases derivadas a clase base. As, se puede asignar a una variable de clase base abstracta cualquier objeto concreto de las clases derivadas. En este ejemplo se define un array de la clase abstracta Figura y se crean objetos de las clases concretas Rectngulo y Crculo.

public abstrac class Figura

{ Figura [ ] af = new Figura [10]; for (int i = 0; i<10; i++) { if (i%2==0) af [ i ] = new Rectngulo() ; else af [ i ] = new Circulo(); } } / / define un array

Normas Relativas a clases abstractas

Una clase abstracta se declara con la palabra reservada abstract como prefijo de la clase. Una clase con al menos un mtodo abstracto es una clase abstracta y hay que declararla como abstracta. Una clase derivada que no redefine un mtodo abstracto es tambin clase abstracta. Las clases abstractas pueden tener variables instancia y mtodos no abstractos. No se puede crear objetos de clases abstracta.

4.3 INTERFACES: definicin, implementacin de interfaces, herencia de interfaces. Una interface es un conjunto de declaraciones de mtodos (sin definicin). Tambin puede definir constantes, que son implcitamente public, static y final, y deben siempre inicializarse en la declaracin. Estos mtodos definen un tipo de conducta. Todas las clases que implementan una determinada interface estn obligadas a proporcionar una definicin de los mtodos de la interface, y en ese sentido adquieren una conducta o modo de funcionamiento.

Una clase puede implementar una o varias interfaces. Para indicar que una clase implementa una o ms interfaces se ponen los nombres de las interfaces, separados por comas, detrs de la palabra implements, que a su vez va siempre a la derecha del nombre de la clase o del nombre de la super-clase en el caso de herencia. Por ejemplo, public class CirculoGrafico extends Circulo implements Dibujable, Cloneable { ... } Qu diferencia hay entre una interface y una clase abstract? Ambas tienen en comn que pueden contener varias declaraciones de mtodos (la clase abstract puede adems definirlos). A pesar de esta semejanza, que hace que en algunas ocasiones se pueda sustituir una por otra, existen tambin algunas diferencias importantes: 1. Una clase no puede heredar de dos clases abstract, pero s puede heredar de una clase abstract e implementar una interface, o bien implementar dos o ms interfaces. 2. Una clase no puede heredar mtodos -definidos- de una interface, aunque s constantes. 3. Las interfaces permiten mucha ms flexibilidad para conseguir que dos clases tengan el mismo comportamiento, inpendientemente de su situacin en la jerarqua de clases de Java. 4. Las interfaces permiten publicar el co mportamiento de una clase desvelando un mnimo de informacin. 5. Las interfaces tienen una jerarqua propia, independiente y ms flexible que la de las clases, ya que tienen permitida la herencia mltiple. 6. De cara al polimorfismo, las referencias de un tipo interface se pueden utilizar de modo similar a las clases abstract.

Definicin de interfaces

Una interface se define de un modo muy similar a las clases. A modo de ejemplo se reproduce aqu la definicin de la interface Dibujable.

// fichero Dibujable.java import java.awt.Graphics; public interface Dibujable { public void setPosicion(double x, double y); public void dibujar(Graphics dw); }

Cada interface public debe ser definida en un fichero *.java con el mismo nombre de la interface. Los nombres de las interfaces suelen comenzar tambin con mayscula. Las interfaces no admiten ms que los modificadores de acceso public y package. Si la interface no es public no ser accesible desde fuera del package (tendr la accesibilidad por defecto, que es package). Los mtodos declarados en una interface son siempre public y abstract, de modo implcito.

Herencia en interfaces

Entre las interfaces existe una jerarqua (independiente de la de las clases) que permite herencia simple y mltiple. Cuando una interface deriva de otra, incluye todas sus constantes y declaraciones de mtodos. Una interface puede derivar de varias interfaces. Para la herencia de interfaces se utiliza asimismo la palabra extends, seguida por el nombre de las interfaces de las que deriva, separadas por comas. Una interface puede ocultar una constante definida en una super-interface definiendo otra constante con el mismo nombre. De la misma forma puede ocultar, re-declarndolo de nuevo, la declaracin de un mtodo heredado de una superinterface.

Las interfaces no deberan ser modificadas ms que en caso de extrema necesidad. Si se modifican, por ejemplo aadiendo alguna nueva declaracin de un mtodo, las clases que hayan implementado dicha interface dejarn de funcionar, a menos que implementen el nuevo mtodo.

IMPLEMENTACIN: Para definir una clase o estructura que implemente una o ms interfaces basta incluir los nombres de las mismas, separndolas con comas si son varias o si la clase definida hereda de otra clase, y asegurar que la clase cuente con definiciones para todos los miembros de las interfaces de las que hereda lo que se puede conseguir definindolos en ella o heredndolos de su clase padre. Las definiciones que se den de miembros de interfaces han de ser siempre pblicas y no pueden incluir override, pues como sus miembros son implcitamente abstract se sobreentiende. Sin embargo, s pueden drsele los modificadores como virtual abstract y usar override en redefiniciones que se les den en clases hijas de la clase que implemente la interfaz. Cuando una clase deriva de ms de una interfaz que incluye un mismo miembro, la implementacin que se le d servir para todas las interfaces que cuenten con ese miembro. Sin embargo, tambin es posible dar una implementacin diferente para cada una usando una implementacin explcita, lo que consiste en implementar el miembro sin el modificador public y anteponiendo a su nombre el nombre de la interfaz a la que pertenece seguido de un punto (carcter.) Cuando un miembro se implementa explcitamente no puede drsele modificadores como en las implementaciones implcitas, ni siquiera virtual o abstract. Una forma de simular los modificadores que se necesiten consiste en darles un cuerpo que lo que haga sea llamar a otra funcin El siguiente ejemplo muestra cmo definir una clase CL que implemente la interfaz IC: class CL:IC { public int Propiedad A? { get {return 5;} set {Console.Write Line?(Asignado {0} a Propiedad A?, value);} }

void IA.Comn(int x) { Console.Write Line?(Ejecutado Comn() de IA); } public int this[int ndice] { get { return 1;} set { Console.Write Line?(Asignado {0} a indizador, value); } } void IB.Comn(int x) { Console.Write Line?(Ejecutado Comn() de IB); } public event D Evento C?; } Las constantes definidas en una interfase se pueden utilizar en cualquier clase (aunque no implemente la interfase) precedindolas del nombre de la interface, como por ejemplo (suponiendo que PI hubiera sido definida en Dibujable):

area = 2.0*Dibujable.PI*r;

Sin embargo, en las clases que implementan la interface las constantes se pueden utilizar directamente, como si fueran constantes de la clase. A veces se crean interfaces para agrupar constantes simblicas relacionadas (en este sentido pueden en parte suplir las variables enum de C/C++). De cara al polimorfismo, el nombre de una interface se puede utilizar como un nuevo tipo de referencia. En este sentido, el nombre de una interface puede ser utilizado en lugar del nombre de cualquier clase que la implemente, aunque su uso estar restringido a los mtodos de la interface.

Un objeto de ese tipo puede tambin ser utilizado como valor de retorno o como argumento de un mtodo.

4.5 REUTILIZACIN DE CDIGO: Un componente se considera reutilizado cuando se introduce en el nuevo esquema junto con toda la informacin que posee, bien por s mismo, bien por el esquema en el que se encuentra. Una clase es reutilizada cuando es introducida en un esquema junto con todas sus jerarquas, asociaciones, atributos, eventos, acciones y representacin grfica (si la tuviera). Las acciones, eventos y atributos que la clase encapsula, a su vez, se consideran reutilizados en el modelo. La reutilizacin aplicada a componentes de alto nivel, como clases y procesos, proporciona los mayores niveles de automatizacin. Su contrapartida resulta ser, normalmente, un elevado nivel de incorporacin de componentes de bajo nivel (acciones y atributos+variables) que no son utilizados nunca, pero que se encuentran incluidos en el esquema por estar encapsulados en dichas clases o procesos.

Você também pode gostar