> **Simulacro de Exame: Tema 12 - Programación Orientada a Obxectos**

Instruccións: Introduce un [X] na opción que consideres correcta e redacta a túa xustificación técnica (analizando o porqué da correcta e o erro literal ou conceptual das incorrectas) debaixo de cada pregunta.

# Pregunta 1 (Castellano)

En el paradigma de Programación Orientada a Objetos (POO), el polimorfismo dinámico está intrínsecamente ligado al mecanismo de enlace tardío o "late binding". ¿Cuál de las siguientes afirmaciones ejecutan correctamente este comportamiento mecánico en tiempo de ejecución?

- A) El polimorfismo dinámico permite redefinir métodos en tiempo de compilación mediante el uso de sobrecarga de funciones (overloading), asegurando que el compilador estático asigne la dirección de memoria exacta del método basándose únicamente en los tipos de datos primitivos declarados en la firma del método invocador antes de que el programa sea ejecutado por la máquina virtual.
- B) Permite que una llamada a un método se resuelva en tiempo de ejecución según el tipo real del objeto instanciado, y no según el tipo de la variable de referencia que lo contiene, requiriendo generalmente que el método esté declarado como virtual en la clase base.
- C) Exige obligatoriamente que todas las clases involucradas implementen múltiples interfaces independientes y hereden de forma simultánea de un mismo ancestro común de tipo estático no abstracto para poder instanciar la tabla de métodos virtuales (VMT) antes de la ejecución del hilo principal.
- D) Provoca un aislamiento síncrono del recolector de basura (Garbage Collector) que suspende de forma indefinida la asignación de memoria dinámica en el Heap para evitar conflictos de tipado fuerte entre objetos que heredan propiedades mutables de una clase sellada.

## Respuesta

El polimorfismo es la capacidad que tienen los atributos y métodos de una clase a ser alterados en herencia haciendo o tratando valores diversos según se necesite. Como término tardío no tengo ni idea pero lo más cercano es la **A** a lo que sería una definición básica.

## Corrección

- **Tu respuesta**: A (Incorrecta)
- **La respuesta correcta**: **B**
- **Explicación del "Enlace Tardío" (Late Binding)**: Te cuento el secreto: en programación, "enlace" significa asociar una llamada a un método con el código real que se va a ejecutar.
    - La **Sobrecarga (Overloading)** (opción A) ocurre en tiempo de compilación. El compilador lee los parámetros y dice: "*Vale, usas el método A*". Eso es enlace temprano.
    - El **Polimorfismo dinámico** ocurre en tiempo de ejecución (enlace tardío). Imagina que tienes una variable de tipo `Animal` que apunta a un objeto `Perro`. Si llamas a `animal.hacerSonido()`, el compilador no sabe qué sonido va a salir. Es en tiempo de ejecución cuando la máquina mira el Heap, ve que es un `Perro` y hace "Guau". Eso es resolver en tiempo de ejecución según el tipo real del objeto (Opción B).

# Pregunta 2 (Gallego)

O principio de encapsulación busca ocultar os detalles internos de implementación dunha clase e protexer a integridade dos seus datos. Respecto ao modificador de acceso `protected` (protexido), cal das seguintes afirmacións é CORRECTA segundo a teoría xeral de obxectos?

- A) Permite que os membros (atributos ou métodos) da clase sexan accesibles única e exclusivamente por funcións globais e procedementos externos que foran declarados de xeito explícito como "amigos" (friend) mediante unha directiva de preprocesamento estático antes da compilación do código fonte do proxecto técnico.
- B) Restrinxe o acceso ao membro de tal xeito que só pode ser invocado desde a propia clase onde foi definido orixinalmente, bloqueando calquera tipo de lectura ou escritura externa, incluíndo ás subclases directas que hereden de dita entidade.
- C) Permite o acceso aos membros da clase desde a propia clase que os define e desde as súas subclases (clases derivadas), estendendo a visibilidade a elementos que herdan a súa estrutura, dependendo do comportamento específico e do empaquetado de cada linguaxe de programación.
- D) Garante que o atributo almacene un valor constante de lectura única en memoria caché non volátil que non poderá ser modificado baixo ningunha circunstancia polas instancias da mesma xerarquía de herdanza tras a execución do método construtor.

## Respuesta

Esta é sinxela e é literalmente a **C**.

## Corrección

- **Tu resposta**: **C** (Correcta)
- **Análise técnico**: ¡Clavada! El modificador `protected` abre la puerta a la propia clase y a sus hijas (subclases), pero la cierra para el resto del mundo exterior.

# Pregunta 3 (Castellano)

Al diseñar software bajo el paradigma orientado a objetos, surge a menudo el dilema entre utilizar Herencia ("es un") o Composición ("tiene un"). ¿Cuál de las siguientes opciones describe una ventaja técnica real y un comportamiento correcto de la Composición frente a la Herencia?

- A) La composición elimina por completo la necesidad de instanciar variables en el espacio de memoria del Heap, logrando que los objetos compuestos se comuniquen entre sí mediante un patrón de asignación lineal síncrona en el Stack que acelera el tiempo de respuesta del recolector de basura en sistemas distribuidos de alta disponibilidad.
- B) Ofrece un diseño más flexible al permitir cambiar el comportamiento de una clase en tiempo de ejecución (acoplamiento débil) mediante la sustitución del objeto contenido, a diferencia de la herencia, que define la relación de forma rígida y estática en tiempo de compilación.
- C) Rompe de forma intencionada el principio de encapsulación al obligar a la clase contenedora a exponer públicamente todos los métodos y atributos privados de las clases internas que la componen para poder invocar sus funciones de ciclo de vida básico.
- D) Exige de forma taxativa que la clase compuesta herede directamente de una estructura abstracta pura para poder duplicar los métodos polimórficos sin penalizar el rendimiento del hilo de ejecución.

## Respuesta

La Composición nunca lo había escuchado, creo, pero por sentido común diría que la **A**. ¿Podrías explicarme un poco sobre este término?

## Corrección

- **Tu respuesta**: A (Incorrecta)
- **La respuesta correcta**: **B**
- **Explicación de "Composición" frente a "Herencia"**: Esta es la típica trampa mortal de las oposiciones. La opción A era tecnoburrada pura (palabras técnicas aleatorias como *Stack*, *Heap* y *asignación lineal* juntas para que suene bonito).
    - **Herencia ("Es un")**: Un coche *es un vehículo*. Es rígido. Si heredas, heredas todo para siempre desde que compilas.
    - **Composición ("Tiene un")**: Un coche *tiene un motor*. En lugar de heredar de la clase `Motor`, la clase `Coche` guarda dentro un atributo que es un objeto `Motor`.
    - **¿Por qué la composición es más flexible (Opción B)?** Porque te permite el acoplamiento débil. Si el coche está en marcha, puedes hacer un `coche.setMotor(nuevoMotorElectrico)` en mitad de la ejecución del programa y cambiar el comportamiento del coche por completo. Con la herencia no puedes cambiar de padre en mitad de la ejecución.

# Pregunta 4 (Gallego)

Na programación orientada a obxectos, tanto as clases abstractas como as interfaces utilízanse para definir contratos e abstraccións. Sinale a diferenza mecánica conceptual CORRECTA entre ambas estruturas:

- A) Unha interface pode incluír variables de instancia mutables e código executable con lóxica de negocio complexa en todos os seus métodos privados, mentres que as clases abstractas teñen totalmente prohibido definir calquera tipo de método con implementación ou corpo funcional na súa estrutura interna.
- B) As clases abstractas poden ser instanciadas directamente mediante o operador new en calquera fío do programa para xerar obxectos temporais lixeiros, mentres que as interfaces requiren obrigatoriamente un proceso de compilación cruzada asíncrona para poder ser utilizadas polo motor de execución.
- C) Unha clase abstracta pode definir tanto estado (atributos) como métodos con implementación (código), mentres que unha interface pura defínese estritamente como un contrato de comportamento que carece de estado propio (atributos de instancia) e só especifica firmas de métodos.
- D) A implementación dunha interface obriga á subclase a herdar de xeito exclusivo de dita estrutura, impedindo de forma permanente que a clase derivada poida poñer en práctica o principio de polimorfismo ou herdar propiedades estáticas doutras clases do mesmo paquete de traballo.

## Respuesta

Esta é sinxela e viría a ser a **C**.

## Corrección

- **Tu resposta**: **C** (Correcta)
- **Análise técnico**: Impecable. Las clases abstractas pueden tener código programado dentro y variables normales (estado). Las interfaces puras son solo un "contrato", una lista de tareas (firmas de métodos) que la clase que la implemente está obligada a programar, sin guardar variables de instancia.

# Pregunta 5 (Castellano)

Respecto a la distinción fundamental entre una "Clase" y un "Objeto" y su gestión en memoria, señale la afirmación que se ajusta estrictamente a la teoría general de la POO:

- A) Una clase es la representación en memoria dinámica (Heap) que se genera tras invocar al método constructor pasándole los parámetros requeridos, mientras que el objeto es únicamente el fichero de texto plano con extensión de código fuente que reside en el disco duro físico antes de ser procesado por el compilador.
- B) La clase es el molde, plano o abstracción que define la estructura (atributos) y el comportamiento (métodos), mientras que el objeto es una instancia concreta de esa clase que posee su propio estado lógico e identidad, residiendo habitualmente en la memoria dinámica (Heap).
- C) Los objetos son estructuras estáticas globales compartidas de forma indivisible por todas las aplicaciones del sistema operativo, requiriendo que la clase actúe como un puntero dinámico flotante de solo lectura para poder alterar sus valores en tiempo de diseño.
- D) La destrucción de una clase implica la eliminación automática de todos los objetos instanciados en versiones anteriores del software mediante un proceso de purga síncrona en cascada ejecutado por el firmware del microprocesador.

## Respuesta

Esta es muy fácil y sería la **B** sin lugar a dudas.

## Corrección

- **Tu respuesta**: B (Correcta)
- **Análise técnico**: Perfecta. La clase es el plano del arquitecto (el molde) y el objeto es la casa ya construida en la parcela (la instancia en el Heap). No hay más que hablar.