Sunteți pe pagina 1din 6

4 polimorfismo y Excepciones

4.1 Definición

El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar


en forma general, en lugar de hacerlo en forma específica. En general nos sirve para programar
objetos con características comunes y que todos estos compartan la misma superclase en una
jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la
programación.
Para ponerlo en práctica se hará un ejemplo bastante sencillo. se hará una librería de clases que
represente figuras tridimensionales y bidimensionales, y su respectiva jerarquía de clases. las clases
deben ser capaces de tener funcionamiento bastante básico, como obtener áreas, volúmenes y
perímetros de la figura correspondiente
la representación de la jerarquía seria como esta:
la superclase de dicha jerarquía podría ser muy parecida a:

Figura. 1. Ejemplo

Las siguientes clases en el nivel de la jerarquía podrían quedar muy parecidos a estas
 public abstract class figura2D extends figura {
 public abstract int calcularArea ();
 public abstract int calcularPerimetro ();
}
 public abstract class figura3D extends figura {
 public abstract int calcularVolumen ();
}

Figura 2: Clase

El polimorfismo en acción
Supongamos que deseamos saber de la figura que tiene mayor área independientemente de su
forma. Perímetro programamos una función que halle el mayor de varios números reales positivos.

Figura 3: Mayor área

Ahora, la llamada a la función valor mayor.

Figura 4. Funcion mayor

La funcion figura mayor que comprara el area de figura planas es semejante a la funcion valorMayor
anteriomente definida, se le pasa el array de objetos de la clase de la figura. La funcion devuelve una
refrencia objeto cuya area en la mayor .

Figura 5. Mayor
La clave de la definición de la función está en la línea.

Figura 6. Función

En la primera línea, se llama a la versión correcta de la función área dependiendo de la referencia al


tipo de objeto que guarde el elemento figuras[i] del array. En areaMayor se guarda el valor mayor de
las áreas calculadas, y en m figura. La figura cuya área es la mayor.
La principal ventaja de la definición de esta función estriba en que la función estriba en que la función
FiguraMayor esta definida en términos de variable Figuras de la clase base Figura, por tanto, trabaja
no solamente para una colección de círculos y rectángulos, sino también para cualquier otra figura
deriva de la clase base figura. Así si se deriva Triangulo de figura, y se añade a la jerarquía de
clases, la función figuraMayor podrá manejar objetos de dicha clase, sin modificar para nada el
código de la misma.
Veamos ahora la llamada de la función FiguraMayor

Figura 7. Función

Pasamos el array figura la función figuraMayor , el valor que retorna lo guardamos en fMayor . Para


conocer el valor del área, desde fMayor se llamará a la función miembro área. se llamará a la versión
correcta dependiendo de la referencia al tipo de objeto que guarde por fMayor. si  fMayor guarda una
referencia a un objeto de la clase Circulo, llama a la función área definida en dicha clase.
si fMayor guarda una referencia a un objeto de la clase Rectángulo, llamara la función área definida
en dicha clase, y así sucesivamente.

La combinación de herencia y enlace dinámico se denomina polimorfismo. El polimorfismo es, por


tanto, la técnica que permite pasar un objeto de una clase derivada a funciones que conocen el
objeto solamente por su clase base.

El poder manipular un Objeto como si este fuera de un tipo genérico otorga mayor flexibilidad al
momento de programar con Objetos, el término Polimorfismo también es asociado con un concepto
llamado late-Binding observé el siguiente fragmento de código:
Figura 8. Código
Inicialmente se puede pensar que este código generaría un error debido a que el tipo de referencia es distinta
a la instancia del objeto, sin embargo, el fragmento anterior es correcto y demuestra el concepto de
Polimorfismo* para asentar este tema se describe un ejemplo más completo:

Uso de Polimorfismo

El uso de Polimorfismo posee ciertos detalles que no fueron descritos en el ejemplo anterior, uno de estos,
que también tiene implicaciones en otros componentes es: Casting.

4.2 Clases abstractas: definición, métodos abstractos, implementación de clases


abstractas, modelado de clases abstractas.

Clases Abstractas

Figura 9. Clases abstractas figura y subclase

Son clases de las que no es posible crear instancias; frecuentemente, están implementadas sólo
parcialmente o no están implementadas. Una clase abstracta es aquella que forzosamente se ha de
derivar si se desea que se puedan crear objetos de la misma o acceder a sus miembros estáticos. El
modificador abstract se utiliza para indicar que una clase está incompleta y que sólo se va a utilizar
como una clase base. Una clase abstracta se diferencia de una clase no abstracta en lo siguiente:

1. No se puede crear una instancia de una clase abstracta directamente, y es un error en tiempo
de compilación utilizar el operador new en una clase abstracta. Aunque es posible tener
variables y valores cuyos tipos en tiempo de compilación sean abstractos, tales variables y
valores serán null o contendrán referencias a instancias de clases no abstractas derivadas de
los tipos abstractos.
2. Se permite que una clase abstracta contenga miembros abstractos, aunque no es necesario.
3. No se puede sellar una clase abstracta.
Cuando una clase no abstracta se deriva de una clase abstracta, la clase no abstracta debe incluir
implementaciones reales de todos los miembros abstractos heredados; por lo tanto, reemplaza a
estos miembros abstractos. En el ejemplo:
abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F() {
// actual implementación of F
}
}

La clase abstracta A define el método abstracto F. La clase B define un método adicional G, pero no
proporciona una implementación de F, por lo que B también debe ser declarada como abstracta. La
clase C reemplaza F y proporciona una implementación real. Dado que no hay miembros abstractos
en C, está permitido que C sea no abstracta, aunque no es necesario.

Métodos Abastractos

Cuando una declaración de método de instancia incluye un modificador abstract, se dice que el
método es un método abstracto. Aunque un método abstracto es también implícitamente un método
virtual, no puede tener el modificador virtual.

Una declaración de método abstracto introduce un nuevo método virtual pero no proporciona una
implementación del método. En cambio, es necesario que las clases derivadas no abstractas
proporcionen su propia implementación mediante el reemplazo del método. Debido a que un método
abstracto no proporciona una implementación real, el cuerpo-del-método de un método abstracto
consiste simplemente en un punto y coma. Las declaraciones de métodos abstractos sólo se
permiten en clases abstractas.

public abstract class Shape


{
public abstract void Paint(Graphics g, Rectangle r);
}
public class Ellipse: Shape
{
public override void Paint(Graphics g, Rectangle r) {
g.DrawEllipse(r);
}
}
public class Box: Shape
{
public override void Paint(Graphics g, Rectangle r) {
g.DrawRect(r);
}
}
La clase Shape define la noción abstracta de un objeto de forma geométrica que puede dibujarse él
mismo. El método Paint es abstracto porque no existe una implementación predeterminada
significativa. Las clases Ellipse y Box son implementaciones Shape concretas. Ya que estas clases
no son abstractas, son necesarias para reemplazar el método Paint y proporcionar una
implementación real

Implementación De Clases Abstractas

El modificador abstract se utiliza para indicar que una clase está incompleta y que sólo se va a
utilizar como una clase base. Una clase abstracta se diferencia de una clase no abstracta en lo
siguiente:

1. No se puede crear una instancia de una clase abstracta directamente, y es un error en tiempo
de compilación utilizar el operador new en una clase abstracta. Aunque es posible tener
variables y valores cuyos tipos en tiempo de compilación sean abstractos, tales variables y
valores serán null o contendrán referencias a instancias de clases no abstractas derivadas de
los tipos abstractos.

2. Se permite que una clase abstracta contenga miembros abstractos, aunque no es necesario.

3. No se puede sellar una clase abstracta.

Cuando una clase no abstracta se deriva de una clase abstracta, la clase no abstracta debe incluir
implementaciones reales de todos los miembros abstractos heredados; por lo tanto, reemplaza a
estos miembros abstractos. En el ejemplo

abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F() {
// actual implementation of F
}
}

La clase abstracta A define el método abstracto F. La clase B define un método adicional G, pero no
proporciona una implementación de F, por lo que B también debe ser declarada como abstracta. La
clase C reemplaza F y proporciona una implementación real. Dado que no hay miembros abstractos
en C, está permitido que C sea no abstracta, aunque no es necesario.

S-ar putea să vă placă și