You are on page 1of 10

Instituto Tecnológico Superior de Tamazunchale

ACTIVIDAD
RESUMEN UNIDAD 4

Nombre del alumno :


Alan Eduardo Martinez Marcos 22ISC031
Docente: ING. IVÁN HERNÁNDEZ HERNÁNDEZ
Materia: PROGRAMACIÓN ORIENTADA A OBJETOS
Carrera: Ingeniería en Sistemas Computacionales
Aula: E1 Segundos semestre turno: matutino
Unidad 4 Polimorfismo
4.1 definición

El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a


Objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli =
Múltiple, morfismo= Formas, esto implica que un mismo Objeto puede tomar diversas formas.

A través del concepto de Herencias ("Inheritance") es posible ilustrar este comportamiento:

El poder manipular un Objeto como si éste 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 (Ligamiento Tardío), observe el siguiente fragmento de código:

Figura a = new Circulo();


Figura b = new Triangulo();

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.
4.2 clases abstractas, definición, métodos abstractos,
implementación de clases abstractas, modelo de clase abstracta

Una de las características más útiles de cualquier lenguaje orientado a objetos es la posibilidad
de declarar clases que definen como se utiliza solamente, sin tener que implementar método.
Esto en Java se hace mediante interfaces y con clases abstractas.

Una clase abstracta es una clase de la que no se puede crear objetos. La utilidad de estas
clases estriba en que otras clases hereden de ésta, por lo que con ello conseguiremos reutilizar
código. Para declarar una clase como abstracta utilizamos la palabra clave abstract.

En método abstract no pude ser static, ya que estos no pueden ser redefinidos por las
subclases.

Clases abstractas
Una clase abstracta no se puede instanciar, pero si se puede heredar y las clases hijas serán
las encargadas de agregar la funcionalidad a los métodos abstractos. Si no lo hacen así, las
clases hijas deben ser también abstractas.
Declaración e implementación de métodos abstractos

Siguiendo con el ejemplo del apartado anterior, se puede escribir:


abstract class FiguraGeometrica {
. . .
abstract void dibujar(); . . .
}
class Circulo extends FiguraGeometrica {
. . .
void dibujar() {
// codigo para dibujar Circulo
. . .
}
}
La clase abstracta se declara simplemente con el modificador abstract en su declaración. Los
métodos abstractos se declaran también con el mismo modificador, declarando el método, pero
sin implementarlo (sin el bloque de código encerrado entre {}). La clase derivada se declara e
implementa de forma normal, como cualquier otra. Sin embargo, si no declara e implementa los
métodos abstractos de la clase base (en el ejemplo el método dibujar) el compilador genera un
error indicando que no se han implementado todos los métodos abstractos y que, o bien, se
implementan, o bien se declara la clase abstracta.

Referencias y objetos abstractos


Se pueden crear referencias a clases abstractas como cualquier otra. No hay ningún
problema en poner:
Figura Geométrica figura;

Sin embargo, una clase abstracta no se puede instanciar, es decir, no se pueden crear objetos
de una clase abstracta. El compilador producirá un error si se intenta:
Figura Geométrica figura = new Figura Geométrica ();

Esto es coherente dado que una clase abstracta no tiene completa su implementación y encaja
bien con la idea de que algo abstracto no puede materializarse.
Sin embargo, utilizando el up-casting visto en el capítulo dedicado a la Herencia si se puede
escribir:
Figura Geométrica figura = new Circulo (. . .);
figura. Dibujar ();

La invocación al método dibujarse resolverá en tiempo de ejecución y la JVM llamará al método


de la clase adecuada. En nuestro ejemplo se llamará al método dibujar de la clase Circulo.
4.3 Interfaces
El concepto de Interface lleva un paso más adelante la idea de las clases abstractas. En Java
una interface es una clase abstracta pura, es decir una clase donde todos los métodos son
abstractos (no se implementa ninguno). Permite al diseñador de clases establecer la forma de
una clase (nombres de métodos, listas de argumentos y tipos de retorno, pero no bloques de
código). Una interface puede también contener datos miembros, pero estos son siempre static
y final. Una interface sirve para establecer un 'protocolo' entre clases.
Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface
puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las
clases. Todos los métodos que declara una interface son siempre public.
Para indicar que una clase implementa los métodos de una interface se utiliza la palabra clave
implements. El compilador se encargará de verificar que la clase efectivamente declare e
implemente todos los métodos de la interface. Una clase puede implementar más de una
interface.

Declaración y uso

Una interface se declara:


interface nombre_interface {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
. . .
}

Por ejemplo:
interface InstrumentoMusical {
void tocar();
void afinar();
String tipoInstrumento();
}

Y una clase que implementa la interface:


class InstrumentoViento extends Object implements InstrumentoMusical {
void tocar() { . . . };
void afinar() { . . .};
String tipoInstrumento() {}
}
class Guitarra extends InstrumentoViento {
String tipoInstrumento() {
return "Guitarra";
}
}

La clase Instrumento Viento implementa la interface, declarando los métodos y


escribiendo el código correspondiente. Una clase derivada puede también redefinir
si es necesario alguno de los métodos de la interface.

Referencias a Interfaces
Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una
referencia a una interface puede ser asignada a cualquier objeto que implemente la interface.
Por ejemplo:
InstrumentoMusical instrumento = new Guitarra();
instrumento.play();
System.out.prinln(instrumento.tipoInstrumento());

InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede instanciar

Extensión de interfaces
Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface
puede extender más de una interface. La sintaxis es:
interface nombre_interface extends nombre_interface , . . . {
tipo_retorno nombre_metodo ( lista_argumentos ) ;
. . .
}
4.4 Variables polimórficas (plantillas): definición, uso y aplicaciones

En Java, las variables que contienen objetos son variables polimórficas. El término
polimórfico (literalmente: muchas formas) se refiere al hecho de que una misma variable puede
contener objetos de diferentes tipos (del tipo declarado o de cualquier subtipo del tipo
declarado). El polimorfismo aparece en los lenguajes orientados a objetos en numerosos
contextos, las variables polimórficas constituyen justamente un primer ejemplo.

Observemos la manera en que el uso de una variable polimórfica nos ayuda a simplificar nuestro
método listar. El cuerpo de este método es:

for (Elemento elemento : elementos)


elemento. Imprimir();

En este método recorremos la lista de elementos (contenida en un ArrayList mediante la variable


elementos), tomamos cada elemento de la lista y luego invocamos su método imprimir. El uso
de herencia en este ejemplo ha eliminado la necesidad de escribir dos ciclos en el método listar.
La herencia evita la duplicación de código no sólo en las clases servidoras sino también en las
clases clientes de aquellas.
4.5 utilización de código

Lo primero que se les viene a la cabeza a los estudiantes (y a muchos profesionales) cuando
se les menciona la reutilización del código es el famoso copiar y pegar al que se han
acostumbrado en la programación estructurada, y de hecho muchos lo hacen en Poo, lo cual
es una de las practicas que más encarece el desarrollo de software. Como todo en Java, el
problema se resuelve con las clases. Para reutilizar el código creamos nuevas clases, pero, en
lugar de partir de cero, partimos de clases, relacionadas con nuestra clase, que han sido ya
creadas y depuradas. El truco está en usar las clases sin ensuciar el código existente.

Una forma de hacer esto es crear objetos de nuestras clases existentes dentro de la nueva
clase. Esto se conoce como composición porque la nueva clase está compuesta de objetos de
clases existentes. Estamos reutilizando la funcionalidad del código, y no la forma.
Otra forma es crear una nueva clase como un tipo de una clase ya existente. Tomamos la forma
de la clase existente y añadimos código a la nueva, sin modificar la clase existente. Esta forma
de crear nuevos objetos se llamada herencia, y lo que hacemos es extender la clase en la que
nos basamos para crear la nueva.

Composición:
Hasta ahora hemos usado la composición de cierta manera, ej. cuando hacemos una interfaz
gráfica de usuario, nuestra clase de interfaz gráfica está compuesta por un frame, unos paneles,
botones, etc. todos estos objetos componen el objeto de interfaz gráfica. Es decir que la
composición consiste en poner manejadores de objetos dentro de nuestra clase, estos
manejadores de objetos no serán otra cosa que instancias de las clases en las que nos estamos
basando para crear la nueva clase.

Herencia
En java aunque no establezcamos de manera explícita la herencia siempre está presente, ya
que todas las clases que creemos heredan de la clase Object, por eso es válido decir que en
java todo es un objeto. La sintaxis para la composición es obvia, pero, para realizar la herencia,
hay una forma claramente distinta. Cuando heredamos, estamos diciendo "Esta nueva clase es
como esa clase antigua", por ejemplo, es decir que la clase Horas “es una” UnidadDeTiempo.
Afirmamos esto en el código dando el nombre de la clase como siempre, pero, antes de la
apertura del límite cuerpo de clase, pondremos la palabra clave "extends" seguida por el nombre
de la clase base. Cuando hagamos esto, obtendremos automáticamente todos los datos
miembros y métodos de la clase base.

La composición y la herencia
Tanto la composición como la herencia permiten poner sub-objetos dentro de tu nueva clase.
Podríamos preguntarnos cuál es la diferencia entre los dos, y cuándo elegir uno en lugar del
otro. La composición es generalmente usada cuando deseamos las características de una clase
existente dentro de una nueva clase, pero no su interfaz. Es decir, ponemos un para poder
usarlo para implementar características de nuestra nueva clase, pero el usuario de esa nueva
clase verá el interfaz que hemos definido en lugar del interfaz del objeto insertado.

Los objetos miembros usan la implementación ocultándose a sí mismos, por lo que esto es una
cosa segura a hacer y, cuando el usuario sabe que estamos uniendo un conjunto de partes,
hace que el interfaz sea más fácil de entender.

Cuando heredamos, estamos cogiendo una clase existente y creando una versión especial de
esa clase. En general, esto significa que estamos tomando una clase de propósito general,
especializándola para un caso o necesidad particular. Pensando un poco, podrá entender que
no tendría sentido construir un coche usando un objeto vehículo (un coche no contiene un
vehículo, ¡es un vehículo!). La relación es- un viene expresada por la herencia, y la relación
tiene un viene expresada por la composición.
REFERENCIAS

• 4.5 utilización de código - Programcion. (s. f.).


https://sites.google.com/site/wwwprogramacionorientadacom/45-utilizacin-de-cdigo
• 4.4 variables, polimorfismo (plantillas) definición, uso y aplicaciones - Programcion.
(s. f.). https://sites.google.com/site/wwwprogramacionorientadacom/44-variables-
polimorfismo-plantillas-definicin-uso-y-aplicaciones
• 4.3 Interfaces. (s. f.). http://fjglez90.blogspot.com/2012/06/43-
interfaces.html?view=sidebar
• 4.2 Clases Abstractas. (s. f.). http://fjglez90.blogspot.com/2012/06/42-clases-
abstractas.html?view=sidebar
• 4.1 definición - Programcion. (s. f.).
https://sites.google.com/site/wwwprogramacionorientadacom/41-definicin

You might also like