Menu
Coddy logo textTech

Recapitulação: Hierarquia de Formas

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 32 de 61.

challenge icon

Desafio

Fácil

Vamos criar uma hierarquia completa de formas que demonstra o poder da herança por meio de composição. Você criará um tipo base Shape do qual qualquer forma específica pode herdar e, em seguida, criará um Rect que o estende.

Você organizará seu código em três arquivos:

  • shape.h: Defina sua hierarquia de structs com proteções contra inclusão múltipla. Crie uma struct Shape com um único campo color (um inteiro). Em seguida, defina uma struct Rect que incorpora Shape como seu primeiro membro e adiciona os campos width e height (ambos inteiros). Declare duas funções: set_color, que recebe um Shape* e um novo valor de cor, e print_rect, que recebe um Rect*.
  • shape.c: Implemente ambas as funções. Sua função set_color trabalha com o tipo base. Ela modifica a cor de qualquer forma. Sua função print_rect exibe todas as informações do retângulo, incluindo sua cor herdada.
  • main.c: Crie um Rect e inicialize todos os seus campos. Em seguida, demonstre o upcasting chamando set_color com seu retângulo convertido para Shape*. Por fim, imprima o retângulo para verificar se a cor foi alterada por meio do ponteiro do tipo base.

Você receberá quatro entradas: a largura do retângulo, sua altura, uma cor inicial e uma nova cor a ser definida por meio da função genérica.

Em seu arquivo principal, crie o retângulo com os valores iniciais, depois use set_color para alterar sua cor para o novo valor (lembre-se de converter seu Rect* para Shape*) e, por fim, chame print_rect para exibir o resultado.

Sua saída deve ser assim:

Width: 10
Height: 5
Color: 7

Onde 10 é a largura, 5 é a altura e 7 é a cor atualizada (não a cor inicial). A ideia principal aqui é que set_color não sabe nada sobre retângulos. Ela funciona apenas com Shape. No entanto, por meio da regra do primeiro membro e do upcasting, a cor do seu retângulo é modificada por meio dessa função genérica.

Experimente você mesmo

#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: Crie um Rect e inicialize todos os seus campos
    // (width, height e a cor do Shape embutido com initial_color)
    
    // TODO: Chame set_color com o retângulo convertido para Shape*
    // para alterar a cor para new_color
    
    // TODO: Chame print_rect para exibir o resultado
    
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online