Primera Parte

1. ¿Qué significa polimorfismo en programación orientada a objetos?

El polimorfismo es la capacidad que tiene un objeto para comportarse de diferentes formas. En la práctica, esto significa que podemos referirnos a objetos de distintas clases a través de una referencia común, y al invocar un método, se ejecutará la versión específica de ese objeto, demostrando que un mismo llamado puede tener múltiples “formas” de ejecución

2. Diferencia entre sobrecarga y sobreescritura de métodos

• La sobrecarga (overload) ocurre cuando existen múltiples métodos en la misma clase con el mismo nombre pero con una firma diferente (distinto número o tipo de parámetros). Por ejemplo, sumar(int a, int b) y sumar(double a, double b)

• La sobrescritura (override) ocurre cuando una subclase proporciona una implementación específica para un método que ya está definido en su superclase (o clases abstractas) o en una interfaz. El método debe tener la misma firma que el método original

3. ¿Qué es una clase abstracta y en qué se diferencia de una interfaz en Java?

Una clase abstracta es una plantilla para otras clases. Permite la herencia y puede contener tanto métodos ya implementados (código común) como métodos abstractos (que las subclases deben definir)

Se diferencia de una interfaz en dos puntos clave:

1. Herencia vs. Contrato: Una clase solo puede heredar de una clase abstracta, mientras que puede implementar múltiples interfaces, las cuales definen un contrato de métodos que la clase se obliga a cumplir.

2. Estado y Código: Las clases abstractas pueden tener atributos (que es) y métodos implementados, mientras que las interfaces tradicionalmente solo definen métodos abstractos (que hace)

4. Ejemplo cotidiano donde un mismo “concepto” tenga diferentes formas

Un ejemplo cotidiano son las palabras homofonas que dependiendo el contexto tienen diferente significado, por ejemplo:

LLAVE -Puede significar una llave para abrir la puerta -Para abrir el agua -Forma de referirse a un amigo -Tecnica de artes marciales -Etc

5. ¿Cómo se relaciona el polimorfismo con el patrón de diseño MVC?

El polimorfismo es fundamental para desacoplar el Controlador del Modelo en MVC, el Controlador no necesita conocer la implementación concreta de los objetos del modelo, simplemente interactúa con ellos a través de una interfaz o una clase abstracta común

Segunda Parte

1. Comparar ventajas y desventajas de usar interfaz vs clase abstracta.

Interfaz:

• Ventaja: Permite que una clase implemente múltiples interfaces, ofreciendo máxima flexibilidad en el diseño (ej. una clase puede ser Serializable y Comparable a la vez).

• Desventaja: No puede contener atributos de instancia ni métodos implementados (salvo default y static en Java 8+), lo que puede generar duplicación de código en las clases que la implementan.

Clase Abstracta:

• Ventaja: Permite compartir atributos y métodos ya implementados, evitando la duplicación de código común entre subclases.

• Desventaja: Limita la herencia, ya que una clase en Java solo puede extender de una única clase padre (sea abstracta o no)

2.¿Qué pasaría si un mismo vehículo pudiera implementar múltiples interfaces (ej: Vehiculo, Electrico)?

Una caracteristica al programar con interfaces en java es que una clase puede implementar multiples interfaces, asi que si un vehiculo tiene varias interfaces este adquiriría las capacidades y “contratos” de todas las interfaces que implementa

3. ¿Qué diferencia hay entre programar contra una clase concreta y programar contra una interfaz?

• Programar contra una clase concreta: Crea un acoplamiento fuerte. El código depende directamente de esa clase específica y solo funciona con instancias de esa clase o sus subclases. Es rígido y difícil de cambiar

•Programar contra una interfaz (o clase abstracta): Crea un acoplamiento débil. El código depende de un “contrato” (la interfaz), no de una implementación específica. Esto permite cambiar fácilmente la implementación sin modificar el código que la utiliza. Es flexible y mantenible