Resumen: Jerarquía de formas
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 32 de 61.
Desafío
FácilVamos a construir una jerarquía de formas completa que demuestre el poder de la herencia a través de la composición. Crearás un tipo base Shape del cual cualquier forma específica pueda heredar, y luego construirás un Rect que lo extienda.
Organizarás tu código en tres archivos:
shape.h: Define tu jerarquía de estructuras con guardas de inclusión. Crea una estructuraShapecon un único campocolor(un entero). Luego define una estructuraRectque embebaShapecomo su primer miembro y añada los camposwidthyheight(ambos enteros). Declara dos funciones:set_colorque recibe unShape*y un nuevo valor de color, yprint_rectque recibe unRect*.shape.c: Implementa ambas funciones. Tu funciónset_colortrabaja con el tipo base: modifica el color de cualquier forma. Tu funciónprint_rectmuestra toda la información del rectángulo, incluyendo su color heredado.main.c: Crea unRecte inicializa todos sus campos. Luego demuestra el upcasting llamando aset_colorcon tu rectángulo convertido a unShape*. Finalmente, imprime el rectángulo para verificar que el color fue cambiado a través del puntero del tipo base.
Recibirás cuatro entradas: el width del rectángulo, su height, un initial color, y un new color para asignar a través de la función genérica.
En tu archivo principal, crea el rectángulo con los valores iniciales, luego usa set_color para cambiar su color al nuevo valor (recuerda convertir tu Rect* a Shape*), y finalmente llama a print_rect para mostrar el resultado.
Tu salida debería verse así:
Width: 10
Height: 5
Color: 7Donde 10 es el ancho, 5 es el alto, y 7 es el color actualizado (no el color inicial). La idea clave aquí es que set_color no sabe nada sobre rectángulos; solo trabaja con Shape. Sin embargo, a través de la regla del primer miembro y el upcasting, el color de tu rectángulo se modifica a través de esta función genérica.
Pruébalo tú mismo
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: Crear un Rect e inicializar todos sus campos
// (width, height, y el color de la Shape incrustada con initial_color)
// TODO: Llamar a set_color con el rectángulo convertido a Shape*
// para cambiar el color a new_color
// TODO: Llamar a print_rect para mostrar el resultado
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