Resumen: Jerarquía de formas
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 32 de 61.
Desafío
FácilConstruyamos una jerarquía completa de formas que demuestre el poder de la herencia mediante composición. Crearás un tipo base Shape del que pueda heredar cualquier forma específica y, después, crearás un Rect que lo extienda.
Organizarás tu código en tres archivos:
shape.h: Define tu jerarquía de estructuras con protecciones contra inclusiones múltiples. Crea una estructuraShapecon un único campocolor(un entero). Después, define una estructuraRectque incluyaShapecomo su primer miembro y añada los camposwidthyheight(ambos enteros). Declara dos funciones:set_color, que recibe unShape*y un nuevo valor de color, yprint_rect, que 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, incluido su color heredado.main.c: Crea unRecte inicializa todos sus campos. Después, demuestra el upcasting llamando aset_colorcon tu rectángulo convertido aShape*. Finalmente, imprime el rectángulo para verificar que el color se modificó mediante el puntero al tipo base.
Recibirás cuatro entradas: el ancho del rectángulo, su alto, un color inicial y un nuevo color que se establecerá mediante la función genérica.
En tu archivo principal, crea el rectángulo con los valores iniciales; después, 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 los rectángulos. Solo trabaja con Shape. Sin embargo, mediante la regla del primer miembro y el upcasting, el color de tu rectángulo se modifica mediante 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: Crea un Rect e inicializa todos sus campos
// (width, height, y el color del Shape embebido con initial_color)
// TODO: Llama a set_color con el rectángulo casteado a Shape*
// para cambiar el color a new_color
// TODO: Llama a print_rect para mostrar el resultado
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