Uso polimórfico
Parte de la sección Programación Orientada a Objetos 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 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 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 reciba un punteroShape*. Esta función debe llamar a la funcióndrawde la forma, después 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 del tipo de forma (cpara un círculo,rpara un rectángulo), seguido de las dimensiones necesarias. Crea la forma correspondiente y después pasa un puntero a su miembroShapeincorporado aprocess_shape. ¡La misma función gestiona ambos tipos!
Tu programa recibirá uno de los siguientes casos:
cseguido de un valor de radio, orseguido 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.54Salida de ejemplo cuando las entradas son r, 4.0 y 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00La 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
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online