Professional Documents
Culture Documents
Microsoft Word - Modulo 2 - Unidad 8 - Conceptos Avanzados - V8.docx - Modulo 2 - Unidad 8 - Conceptos Avanzados - v8
Microsoft Word - Modulo 2 - Unidad 8 - Conceptos Avanzados - V8.docx - Modulo 2 - Unidad 8 - Conceptos Avanzados - v8
FUNDAMENTOS DE LA
PROGRAMACIÓN
1
Módulo 2:
PROGRAMACIÓN ORIENTADA A
OBJETOS
Unidad 8:
CONCEPTOS AVANZADOS
2
Presentación
Con esta Unidad, que cierra los aspectos netamente orientados al paradigma de
la POO, se analizan los conceptos más avanzados del mismo.
Así mismo se analiza otro de los mecanismos más poderosos del paradigma: el
Polimorfismo, otro de los pilares de la POO.
Otros de los temas que serán analizados y que tiene un correlato directo con las
prácticas de programación y los lenguajes de programación actuales son las
clases abstractas y las interfaces, ambos temas muy importantes de ser
adquiridos.
3
Objetivos
Que los participantes …
Incorporen los conceptos de interfaces y clases abstractas.
Incorporen los conceptos de casting, o transformación de tipos de datos.
Comprendan el mecanismo del Polimorfismo.
Comprendan el concepto de clases internas.
4
Bloques temáticos
1. Interfaces
2. Clases abstractas
3. Clases internas
4. Casteo ("casting")
5
1. Interfaces
Por lo que podemos decir que una clase, en realidad, es un archivo, si lo llevamos
al “plano físico”.
También nos podemos encontrar algunos otros elementos, como las interfaces o
las clases abstractas (conceptos que revisaremos a continuación), que suelen
encontrarse también en archivos con la misma extensión que una clase, por lo
que será necesario revisar el contenido y comprobar si se trata de una clase o
interface antes de poder usarla o invocarla.
6
“interfaces de usuario”, haciendo referencia a un frontend o capa de
presentación de una aplicación, o a las “interfaces entre sistemas”, entiendo
por estas como un canal por el cual se comunican dos o más aplicaciones.
Cuando una clase “usa” una interface, se dice que la “implementa”. O sea, la
clase termina siguiendo las reglas que le impone la interface.
Repasando, al ser este un punto que suele prestarse a confusión, podemos decir
que una interface:
Tiene una “forma” parecida a una clase
7
Una interface puede ser implementada por un número indefinido de clases
Una clase que implementa una interface puede hacer uso de los atributos
definidos en la misma y DEBE implementar TODOS los métodos que
tenga
8
De forma análoga al uso de la Herencia podemos decir que, según esta estructura,
un “Hombre” ES del tipo “Animal” y que un “Pez” es también del tipo “Animal”. No
se puede hacer la relación inversa (un “Animal” no es un “Hombre”).
También podemos ver que la interface “Animal” se encuentra la firma del método
“respiración”. Recordar que el concepto de “firma” lo analizamos en la Unidad
anterior. En ambas clases que implementan la interface, se puede ver como cada
una la implementa de forma particular, según las necesidades del caso.
9
ACTIVIDAD DE ANÁLISIS 1:
¿Qué otros ejemplos de Interfaces y sus implementaciones se les vienen a la
mente?
Expresarlas en forma similar al ejemplo Animal, Hombre, Pez. Con una interface
y dos o tres clases es suficiente para resolverlo.
IMPORTANTE:
¡Traten de resolverlo cada uno por sus propios medios!
Las respuestas (el programa) NO debe ser enviado a los foros del
Campus, salvo dudas puntuales de las respuestas.
10
2. Clases abstractas
Las clases abstractas no están implementadas en todos los lenguajes OO, aunque
es interesante nombrarlas ya que están presentes en la mayoría de los lenguajes
más difundidos en la actualidad.
Al igual que las interfaces, se presentan en archivos físicos similares a las clases.
Para identificarlas, incorporaremos la palabra reservada “abstracta” en la
declaración de la clase.
Otra similitud que guardan con las interfaces es que tampoco pueden instanciarse.
Dicho de otra forma, no es posible crear un objeto en base a una clase
abstracta, justamente por su naturaleza de abstracción que implica un nivel
demasiado alto o generalista.
Así como la interface dice cuál va a ser el comportamiento de una clase, la clase
abstracta aclara también el detalle de ese comportamiento.
11
En el siguiente ejemplo, podemos ver como dos clases “Gerente” y “Supervisor”,
que heredan de la clase “Empleado”, siendo ésta abstracta, tienen todos los
atributos y métodos de la clase padre, pero cada una de estas debe implementar
un método en particular llamado “calculaSueldoConBeneficios”, ya que la forma
de cálculo de los beneficios varía entre los tipos de empleados.
12
Tanto la clase “Supervisor” como “Gerente” heredan la clase abstracta
“Empleado”. Esta clase es abstracta, ya que tiene la firma de un método abstracto
llamado “calculaSueldoConBeneficios()”.
En el que caso de encontrarnos con una clase abstracta que tiene TODOS
sus métodos abstractos sin implementar, deberíamos preguntarnos si esa
clase abstracta no debería ser una interfaz.
13
ACTIVIDAD DE ANÁLISIS 2:
¿Qué otros ejemplos de clases abstractas y sus “herederas” se le vienen a la
mente?
IMPORTANTE:
¡Traten de resolverlo cada uno por sus propios medios!
Las respuestas (el programa) NO debe ser enviado a los foros del
Campus, salvo dudas puntuales de las respuestas.
14
3. Clases internas
Las “inner classes” son un mecanismo que proveen algunos lenguajes OO que
permite definir una clase dentro de otra; de forma similar a la que una clase
puede tener métodos y atributos, a través de este concepto también podría
contener otra clase.
La clase interna es tomada como un miembro más de la clase externa (la que la
contiene), por lo que se puede aplicar sobre la interna todos los modificadores de
acceso en forma similar a como se hace con atributos y métodos.
El uso de clases internas es una práctica que tiende a quedar en desuso, dado
que se le critica el hecho de agregar complejidad y confusión al código de la clase
y de aquellas que las usan.
Por este motivo, en lo que respecta a este curso, nos quedaremos con el concepto
y la definición, pero no profundizaremos en la práctica.
15
4. Casteo ("casting")
Para esto se utiliza el operador “cast” (que introducimos como nueva palabra
reservada), cuya sintaxis es:
(tipo)expresión
16
“El número pasado a entero es 3”
Ya que se trasformó un número con coma a otro que no soporta coma, pero que
tiene cierta coherencia conceptual (ambos son números). Esto significa que
no tendría sentido (de hecho, produciría un error de compilación) si se quiere
pasar, por ejemplo, una fecha a número con coma o un texto a número. No así,
pasar una fecha a texto, práctica que suele ser utilizada para permitir la
manipulación de la fecha.
17
5. Principios de la OO: Polimorfismo
Este es uno de los principios de la OO que más confusiones suele traer. Aunque,
a su vez, es una herramienta poderosa para lograr un código claro y robusto, a la
vez que se aprovechan al máximo las posibilidades que brindan la OO.
18
19
En este ejemplo tenemos:
Clase Abstracta Operacion: define un método abstracto, que permitirá
realizar cada operación concreta. Todas las operaciones concretas deberán
heredar de esta clase.
20
"metodo privado mostrar(Multiplicacion op)"
21
De esta forma solo agregamos un nuevo atributo y la invocación, pero el método
"mostrar" no cambia. Eso se puede lograr solamente con polimorfismo.
Tanto "atrib1" como "atrib2" son del tipo "MiInterfaz", aunque se instancian
de diferente manera.
22
Pregunta frecuente: ¿Cuál es la diferencia sustancial entre Interface y
Clase abstracta en cuanto a su uso?
La realidad indica que una clase abstracta SIN métodos propios (o sea,
solamente con método abstractos) no difiere en gran medida de una
interfaz: ninguna de las 2 puede ser instanciada y los que las quieran usar
(por herencia o implementación en cada caso) deberá desarrollar
(implementar) esos métodos en sus clases.
23
Por ejemplo: sabemos que todas las personas tienen un nombre. No
quisiéramos, entonces, modelar una entidad persona que pueda no tener
nombre. Entonces vamos a definir una interfaz "Persona" que va a obligar
a que todas las personas concretas que tengamos (físicas o jurídicas, por
ejemplo) tengan un nombre.
24
¿Por qué polimorfismo?
El polimorfismo no muestra su cara más útil o sus
beneficios como lo hace la herencia (por ejemplo: evitar el
copypaste). Pero como alternativa que nos ofrece el
paradigma para resolver problemas puntuales, es importante conocer, al
menos, su concepto.
Es, también, una técnica de programación presente, sobre todo, en la
ESTRUCTURA de los lenguajes. Por ejemplo, en Java está muy presente en
varios usos cotidianos del lenguaje.
Por ejemplo, para usar un ArrayList (es como un vector, pero en objetos y
con muchos métodos útiles), cuando queremos crear un objeto (de manera
simplificada) lo hacemos así:
Donde:
"List" es una interfaz.
"list" es el objeto
25
6. Tips de uso y ejemplos
Interfaces
Ejemplo 1:
26
En este ejemplo, vemos al final la interfaz. Notar que los métodos no están
implementados, sino que solo se colocan LAS FIRMAS de los métodos (la firma,
recuerden, incluye los tipos de datos de los parámetros, pero no lo nombres de
los parámetros: en este caso son "Boolean" en un método y "Integer" en el otro.
Ejemplo 2:
27
28
En este ejemplo vamos a crear personas sobre las cuales se va a calcular la edad.
Vamos a diferenciar adultos de niños, porque de los adultos me interesa saber
(además de la edad) a qué generación pertenecen. De los niños no. Por lo tanto,
se crean 2 clases diferentes: "Ninios" y "Adultos". Cada una va a tener un
comportamiento diferente. Son parecidas, pero no iguales. Y, de hecho, realizan
diferentes acciones.
Pero como queremos que sea obligatorio el cálculo de la edad para todos los tipos
de personas que existan, vamos a hacer que las clases contengan un mínimo de
comportamiento que deben tener sí o sí. Para esto, definimos que las clases van
a implementar la interfaz "Persona", que va a contener la estructura básica, el
mínimo de comportamiento que toda clase que modele personas debe tener.
29
Clases abstractas
30
Primera clase:
31
En este ejemplo, defino una clase abstracta (Figura) con un método abstracto
(calculoArea()). Esta clase va a manejar lo referido al color de las figuras creadas,
pero va a delegar en sus clases hijas el manejo del cálculo del área de cada figura
concreta que se implemente.
Siguiendo con el ejemplo, vemos las figuras concretas que se pueden crear: el
cuadrado y el triángulo. Ambos son tipos de figuras, por lo que la herencia tiene
sentido. Ambas clases tiene un constructor sobrecargado que recibe diferentes
parámetros: el color (atributo colorN), que va a servir para modificar el atributo
"color" de la clase padre Figura. Además, otros parámetros necesarios para poder
hacer el cálculo.
Cuarta clase:
Continuamos cuando se invocan a los métodos del objeto del "c1", para poder
calcular el área y mostrar el color previamente ingresado.
32
En relación a qué se pude y que no se puede hacer con las clases, clases
abstractas, interfaces, atributos, métodos y sus modificadores de acceso.
Clase Abstracta Interface
¿Puede tener atributos? Si Si Si
¿Puede tener firmas de métodos con el
No Si No
modificador "abstracto"?
¿Se puede instanciar / crear un objeto a
Si No No
partir de ella?
¿Se puede declarar un atributo de ese tipo? Si Si Si
¿Debe tener solo firmas de métodos? No No Si
¿Puede tener métodos implementados
Si Si No
(desarrollados)?
¿Debe llevar modificadores de acceso en
Si Si Si
atributos y métodos/firmas?
¿Puede heredar de otra clase? Si Si No
¿Puede heredar de otra interface? No No Si
¿Puede heredar de una clase común e
Si Si No
implementar una interface?
¿Puede heredar de una clase abstracta e
Si Si No
implementar una interface?
¿Puede heredar de una clase abstracta? Si Si No
¿Puede heredar de una clase no abstracta? Si Si No
¿Puede implementar una interface? Si Si No
33
ACTIVIDAD DE ANÁLISIS INTEGRADORA:
34
ver cómo se integran todos los componentes anteriores, como "funciona"
todo en conjunto, como se ensamblan las partes separadas en una lógica
única y completa.
IMPORTANTE:
¡Traten de resolverlo cada uno por sus propios medios!
Las respuestas (el programa) NO debe ser enviado a los foros del
Campus, salvo dudas puntuales de las respuestas.
35
ANEXO 1 - Respuesta Actividad de Análisis 1
En caso negativo, ¡no avancen y traten de resolverlos antes de ver las respuestas!
36
Página dejada intencionalmente en blanco
37
Página dejada intencionalmente en blanco
38
Ejemplo 1)
39
Ejemplo 2)
40
Ejemplo 3)
41
Ejemplo 4)
42
Ejemplo 5)
43
Ejemplo 6)
44
Ejemplo 7)
45
Ejemplo 8)
46
Ejemplo 9)
47
Ejemplo 10)
48
ANEXO 2 - Respuesta Actividad de Análisis 2
49
Página dejada intencionalmente en blanco
50
Página dejada intencionalmente en blanco
51
Ejemplo 1)
52
Ejemplo 2)
53
Ejemplo 3)
54
Ejemplo 4)
55
Ejemplo 5)
56
Ejemplo 6)
57
Ejemplo 7)
58
Ejemplo 8)
59
Ejemplo 9)
60
Ejemplo 10)
61
ANEXO 3 - Respuesta Actividad de Análisis
Integradora
62
Página dejada intencionalmente en blanco
63
Página dejada intencionalmente en blanco
64
Ejemplo 1)
65
66
Ejemplo 2)
67
68
69
Ejemplo 3)
70
71
72
Ejemplo 4)
73
74
75
Ejemplo 5)
76
77
78
Ejemplo 6)
79
80
Ejemplo 7)
81
ANEXO 4 - Checklist de código
Cumple
Tema Si No
Las interfaces tienen únicamente atributos y firmas de
métodos y no tienen métodos implementados (desarrollados)
Una clase que implementa una interfaz, está implementando
todos los métodos cuyas firmas aparecen en la interfaz, SIN
excepciones, TODOS los métodos
Las clases abstractas tiene el modificador "abstracta" en la
declaración de la clase
Las clases abstractas tienen, al menos, un método abstracto
Los métodos abstractos no están implementados, sino que
solamente tienen la firma del método (incluidos parámetros y
tipo que retorna) y el modificador “abstracto".
La clase que hereda de una clase abstracta implementa
TODOS los métodos abstractos de la clase abstracta
La firma de los métodos abstractos (en la clase abstracta) es
la misma firma que la de los métodos implementados en la
clase hija.
Se verifica que los tipos de datos en el casting no impliquen
tipos incompatibles (String a Integer, por ejemplo) ni pérdida
de precisión (Float a Integer).
Se verifica que no hay métodos abstractos en clases NO
abstractas
Los métodos abstractos implementados (en la clase hija) no
llevan el modificador “abstracto".
Si todas las respuestas son afirmativas, hay muy altas chances que el
programa esté libre de errores de código.
82
ANEXO 5 - Preguntas frecuentes
fin metodo
fin clase
fin metodo
fin clase
fin metodo
83
fin clase
muestroPersona(h1)
muestroPersona(nh)
muestroPersona(p1)
muestroPersona(p2)
fin metodo
mostrar: p.tipo
fin metodo
fin clase
Explicación:
84
- por lo tanto, al instanciar esas clases, los objetos que se crean son del tipo
específico ("Humano" y "NoHumano"). Y, además, también son del tipo no
específico "Persona" por la relación de herencia.
85
R: Se pueden usar interfaces cuando se quiere que, por ejemplo, un grupo
de entidades cumplan sí o sí con cierto comportamiento mínimo en forma
obligatoria: las personas tienen nombre, sean personas físicas o no.
También podemos pensar que a todas las formas geométricas se les puede
calcular el área, pero cada una lo calcula de diferente forma.
Por otro lado, todos los edificios son construcciones, pero existen
diferentes tipos como casas, apartamentos, dúplex, etc. y todas tienen, por
ejemplo, una identificación (dirección), ubicación, tamaño...
Con las clases abstractas se pueden pensar algo de forma similar, teniendo
presente que a los tipos concretos (clases hijas) ya se le puede agregar
alguna funcionalidad resuelta (métodos implementados) y pedirles que las
clases hijas resuelvan su funcionamiento de la forma que más les sirve a
cada una (métodos abstractos).
5) P: Sobre la utilidad de una interface: ¿es un "recordatorio" para que otras clases
la implementen? Y ¿cuál sería su utilidad práctica? ¿Es evitable su uso?
Con tomar el cartón, tijeras y haciendo los cortes sería suficiente, ¿es
verdad? Puede quedar bien o no tan bien, pero no parece tan difícil.
86
Ahora bien, supongamos ahora no es una, sino que es necesario cortar 20
de esas formas y solo tenemos los cartones, una tijera y buscamos una hoja
de papel: ¿no sería más sensato hacer un molde con el papel y luego cortar
los 20 cartones siguiendo el patrón? ¿O seguiríamos haciendo los 20 cortes
a ojo?
6) P: ¿Una clase puede heredar de una clase padre y, a su vez, esa misma clase
(la hija) puede implementar una interfaz?
R: Si, todas las clases llevan constructor, incluso las abstractas, a pesar de
no poder instanciarse.
8) P: Si una clase abstracta hereda de una clase común ¿las clases hijas de la
clase abstracta, también podrían acceder a la clase padre de la abstracta?
87
9) P: ¿Es correcto el siguiente ejemplo?:
10) P: ¿Es posible implementar una interfaz en una clase que hereda de una clase
abstracta? Por ejemplo:
88