REPORTE DE PRACTICA - HernandezSaucedo - JimenezDeLosSantos TEMA 4 2g2C
REPORTE DE PRACTICA - HernandezSaucedo - JimenezDeLosSantos TEMA 4 2g2C
En Sistemas Computacionales
INTEGRANTES:
Fecha de entrega:
14/12/2021
En la programación orientada a objetos, el polimorfismo es la capacidad de los objetos de clase para dar una
respuesta diferente e independiente dependiendo de los parámetros (diferentes implementaciones)
utilizados para llamarlos. En otras palabras, un objeto como entidad puede contener valores de diferentes
tipos durante la ejecución del programa. En JAVA, el término polimorfismo a menudo se define como
"sobrecarga de parámetros", lo que puede no parecer muy divertido, pero como veremos más adelante,
genera cierta confusión. De hecho, a menudo se confunde con el tipo más común de polimorfismo, pero el
uso de este nombre no es del todo correcto.
Cuando hablamos de polimorfismo, no significa que nos hayamos vuelto locos. Todo el mundo sabe que
quienes se especializan en el desarrollo de software tienen un lenguaje propio, y eso no significa que un
objeto del espacio que estuvo congelado durante miles de años en la Antártida haya vuelto a la vida. No, no
estamos hablando de una película de terror de los 80, sino de un concepto que, por su utilidad, debería estar
en ABC en cualquier libro de programación.
MARCO TEÓRICO
4.1 Polimorfismo
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.
Recuerde el ejemplo del ecosistema, en donde todos los objetos de las distintas especies heredaban de una
superclase llamada Animal, que brindaba la información general de cualquier animal, independiente de su
especie. Sin embargo, cada especie hace un uso particular de cada uno de los métodos u operaciones de la
clase Animal. El método comer() no se ejecutará de la misma manera en un León() o en un Pavo(). Lo
mismo ocurre para métodos moverse() en objetos de tipo Tiburón() o Gallina(), aunque todas las especies
realicen estos métodos. A la sobrescritura o implementación específica de métodos es la clave del
polimorfismo
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:
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.
Se permite que una clase abstracta contenga miembros abstractos, aunque no es necesario.
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.
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.
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.
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:
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. Se permite que una clase
abstracta contenga miembros abstractos, aunque no es necesario.
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.
Modelado de clases abstractas
4.3 Definición de Interfaces
Las interfaces Java son expresiones puras de diseño. Se trata de auténticas conceptualizaciones no
implementadas que sirven de guía para definir un determinado concepto (clase) y lo que debe hacer, pero
sin desarrollar un mecanismo de solución. Se trata de declarar métodos abstractos y constantes que
posteriormente puedan ser implementados de diferentes maneras según las necesidades de un programa.
Por ejemplo una misma interfaz podría ser implementada en una versión de prueba de manera poco óptima,
y ser acelerada convenientemente en la versión definitiva tras conocer más a fondo el problema.
Declaración
Para declarar una interfaz se utiliza la sentencia interface, de la misma manera que se usa la sentencia
class:
Interface MiInterfaz {
Int CONSTANTE = 100;
Int metodoAbstracto( int parametro );
}
Se observa en la declaración que las variables adoptan la declaración en mayúsculas, pues en realidad
actuarán como constantes final. En ningún caso estas variables actuarán como variables de instancia.
Por su parte, los métodos tras su declaración presentan un punto y coma, en lugar de su cuerpo entre llaves.
Son métodos abstractos, por tanto, métodos sin implementación
Como ya se ha visto, las interfaces carecen de funcionalidad por no estar implementados sus métodos, por
lo que se necesita algún mecanismo para dar cuerpo a sus métodos. La palabra reservada implements
utilizada en la declaración de una clase indica que la clase implementa la interfaz, es decir, que asume las
constantes de la interfaz, y codifica sus métodos: class ImplementaInterfaz implements MiInterfaz{ int
multiplicando=CONSTANTE; int metodoAbstracto( int parametro ){ return ( parametro * multiplicando ); } }
En este ejemplo se observa que han de codificarse todos los métodos que determina la interfaz
(metodoAbstracto()), y la validez de las constantes (CONSTANTE) que define la interfaz durante toda la
declaración de la clase. Una interfaz no puede implementar otra interfaz, aunque sí extenderla (extends)
ampliándola
Las interfaces, al igual que las clases, también permiten la herencia. Para indicar que una interfaz hereda de
otra se indica nuevamente con la palabra reservada extends. Pero en este caso sí se permite la herencia
múltiple de interfaces. Si se hereda de más de una interfaz se indica con la lista de interfaces separadas por
comas, una clase podrá 'heredar' de más de un interfaz. Las interfaces nos permiten definir
comportamientos comunes entre clases dispares que no se relacionan evitando crear relaciones forzadas y
colisiones de nombres.
4.4 Variables Polimórficas
Definición, Uso Y Aplicaciones
Es la capacidad que tiene los objetos de comportarse de múltiples formas. Polimorfismo: Upcasting
Únicamente tienen sentido por la existencia de la herencia. ¨El polimorfismo (o upcasting) consiste en la
posibilidad de que una referencia a objetos de una clase pueda conectarse también con objetos de
descendientes de ésta.
El sentido del polimorfismo es realizar una generalización, olvidar los detalles concretos de uno o varios
objetos de distintas clases y buscar un punto común a todos ellos en un ancestro Se trata de algo que
realiza comúnmente la mente humana durante el proceso de Razonamiento.
Las conexiones polimórficas se realizan a veces de manera implícita en el paso de argumentos a una
operación. Puede contener referencias a objetos de diferentes clases.
El polimorfismo hace posible que un usuario pueda añadir nuevas clases a una jerarquía sin modificar o
recompilar el código escrito en términos de la clase base.
Permite programar a nivel de clase base utilizando objetos de clases derivadas Se puede clasificar el
polimorfismo en dos grandes clases:
Polimorfismo dinámico(o polimorfismo paramétrico) es aquél en el que el código no incluye ningún tipo de
especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos
compatible.
Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo
deben ser explicitados y declarados uno por uno antes de poder ser utilizados.
El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación
genérica. También se clasifica en herencia por redefinición de métodos abstractos y por método
sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros.
En términos de programación, el polimorfismo permite que un solo nombre de clase o de método represente
diferente código seleccionado mediante algún mecanismo automático. De esta forma, puesto que un nombre
puede representar diferente código, también puede representar muchos comportamientos distintos.
Un lenguaje que acepta el polimorfismo es un lenguaje polimórfico.
Un lenguaje monomórfico no acepta el polimorfismo, está restringido a un comportamiento estático, porque
cada nombre está ligado en forma estática a su código.
Ejemplo
Public class ObjetoPesimista extends ObjetoPersonalidad {
Public String hablar() {
Return “El vaso está medio vacio.”;
}
}
Public class ObjetoOptimista extends ObjetoPersonalidad {
Public String hablar() {
Return “El vaso está medio lleno.”;
}
}
Por mucho tiempo la reutilización de código se había limitado únicamente al cortado y pegado de código, el
programador se acordaba donde tenía un código igual o parecido para utilizarlo en el proceso o actividad de
programación actual.
Con la programación estructurada se dio un gran paso para la optimización y ahorro en la construcción de
código. Con los tipos abstractos de datos también se dio un buen Avance en la abstracción y solución a
situaciones donde se necesitaba una solución computacional.
Los paradigmas presentes en la ingeniería del software permiten un aprovechamiento más eficiente del
código ya construido.
Otra punto importante sería revisar las teorías importantes sobre Arquitecturas de Software, donde
dependiendo del sistema a construir podemos seleccionar una u otra arquitectura. La arquitectura a grandes
rasgos son los Elementos, antes llamados componentes, las relaciones de estos componentes, su adecuada
agregación, unión e interrelación para formar un todo.
Entonces cuando se habla de reutilización de código se busca el ahorro de tiempo y esfuerzo y la Ingeniería
del Software evoluciona para brindar nuevas y mejores estrategias para la industria del software.
CONCLUSIÓN
En conclusión en este reporte fueron reforzados los conocimientos adquiridos durante las sesiones en
dónde desde el aprendizaje hasta la práctica entender de qué manera funcionan los métodos del
polimorfismo ya que está conformado de distintos factores como lo son , Las clases abstractas, como la
herencia , y sus métodos al igual que poder comprender de qué manera los códigos funcionan en la
máquina así como saber que existe la reutilización de códigos, sabiendo que son de las herramientas más
fundamentales al momento de programar ya que este nos ayuda bastante a poder reutilizar códigos y hacer
nuevos códigos de manera más eficiente y rápida utilizando lo que ya hemos realizado en antiguos códigos,
así como entender de qué forma van ordenadas por jerarquías, podemos definir el polimorfismo como la
característica que le permite a un cliente enviar un mensaje a objetos de diferentes tipos sin conocer
exactamente el tipo que se está usando El único requisito que deben de cumplir estos objetos es saber
responder a dicho mensaje. De esta manera, bajo un mismo símbolo (el método o mensaje usado) se van a
ejecutar comportamientos diferentes dependiendo de a qué objeto apunte la variable de referencia que
usamos para enviar el mensaje.
REFERENCIAS