Menu
Coddy logo textTech

Uso polimórfico

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 47 de 61.

challenge icon

Desafío

Fácil

Demostremos que el polimorfismo realmente funciona escribiendo una función que pueda procesar cualquier forma mediante el puntero base Shape*, ya sea un Circle o un Rectangle.

Partiendo de tus implementaciones existentes de Circle y Rectangle, añadirás una abstracción potente: una única función que funciona uniformemente con cualquier tipo de forma.

Tu proyecto incluirá estos archivos:

  • shape.h: Tu interfaz base Shape con los tipos DrawFunc y AreaFunc.
  • circle.h y circle.c: Tu implementación de Circle de la lección anterior.
  • rectangle.h y rectangle.c: Tu implementación de Rectangle de la lección anterior.
  • shape.c: Implementa una nueva función llamada process_shape que reciba un puntero Shape*. Esta función debe llamar a la función draw de la forma, después llamar a su función area e imprimir el resultado con 2 decimales en el formato Area: X.XX.
  • main.c: Demuestra el polimorfismo en acción. Lee un indicador del tipo de forma (c para un círculo, r para un rectángulo), seguido de las dimensiones necesarias. Crea la forma correspondiente y después pasa un puntero a su miembro Shape incorporado a process_shape. ¡La misma función gestiona ambos tipos!

Tu programa recibirá uno de los siguientes casos:

  • c seguido de un valor de radio, o
  • r seguido de valores de anchura y altura

Salida de ejemplo cuando las entradas son c y 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Salida de ejemplo cuando las entradas son r, 4.0 y 3.0:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

La clave aquí es que process_shape no sabe si está trabajando con un Circle o un Rectangle. Solo conoce la interfaz Shape. Al convertir el miembro Shape incorporado de tu forma concreta en un Shape*, puedes pasar cualquier tipo de forma a esta única función. Esto es polimorfismo: una función y múltiples comportamientos según el tipo real del objeto.

Recuerda declarar process_shape en shape.h para que pueda llamarse desde main.c.

Pruébalo tú mismo

#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Lee un char para el tipo de forma ('c' para círculo, 'r' para rectángulo)
    // TODO: Si 'c', lee el radio, crea un Circle y llama a process_shape con su base
    // TODO: Si 'r', lee el ancho y la altura, crea un Rectangle y llama a process_shape con su base
    return 0;
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online