Uso polimórfico
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 47 de 61.
Desafío
FácilDemostremos 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 baseShapecon los tiposDrawFuncyAreaFunc.circle.hycircle.c: Tu implementación de Circle de la lección anterior.rectangle.hyrectangle.c: Tu implementación de Rectangle de la lección anterior.shape.c: Implementa una nueva función llamadaprocess_shapeque recibe un punteroShape*. Esta función debe llamar a la funcióndrawde la forma, luego llamar a su funciónareae imprimir el resultado con 2 decimales en el formatoArea: X.XX.main.c: Demuestra el polimorfismo en acción. Lee un indicador de tipo de forma (cpara círculo,rpara rectángulo) seguido de las dimensiones necesarias. Crea la forma apropiada, luego pasa un puntero a su miembroShapeembebido aprocess_shape. ¡La misma función maneja ambos tipos!
Tu programa recibirá ya sea:
cseguido de un valor de radio, orseguido 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.54Ejemplo de salida cuando las entradas son r, 4.0, y 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00La 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
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo