Menu
Coddy logo textTech

Uso polimórfico

Parte de la sección Object Oriented Programming 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 a través del puntero base Shape* — ya sea un Circle o un Rectangle.

Basándote en tus implementaciones existentes de Circle y Rectangle, añadirás una abstracción potente: una única función que trabaja con cualquier tipo de forma de manera uniforme.

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 recibe un puntero Shape*. Esta función debe llamar a la función draw de la forma, luego 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 de tipo de forma (c para círculo, r para rectángulo) seguido de las dimensiones necesarias. Crea la forma apropiada, luego pasa un puntero a su miembro Shape embebido a process_shape. ¡La misma función maneja ambos tipos!

Tu programa recibirá ya sea:

  • c seguido de un valor de radio, o
  • r seguido de valores de ancho y alto

Ejemplo de salida cuando las entradas son c y 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Ejemplo de salida cuando las entradas son r, 4.0, y 3.0:

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

La magia aquí es que process_shape no tiene idea de si está trabajando con un Circle o un Rectangle — solo conoce la interfaz Shape. Al realizar un cast del miembro Shape embebido de tu forma concreta a un Shape*, puedes pasar cualquier tipo de forma a esta única función. Esto es polimorfismo: una función, múltiples comportamientos basados en el tipo de objeto real.

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

Pruébalo tú mismo

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

int main() {
    // TODO: Leer un char para el tipo de forma ('c' para circle, 'r' para rectangle)
    // TODO: Si es 'c', leer radius, crear un Circle, y llamar a process_shape con su base
    // TODO: Si es 'r', leer width y height, crear un Rectangle, y llamar a process_shape con su base
    return 0;
}

Todas las lecciones de Object Oriented Programming