Menu
CoddyTech

Revisã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 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 guardas de inclusão. 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 as duas 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 a cor herdada.
  • main.c: Crie um Rect e inicialize todos os seus campos. Em seguida, demonstre a conversão para o tipo base 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 para o tipo base.

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

No 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 semelhante a esta:

Width: 10
Height: 5
Color: 7

Em que 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 trabalha apenas com Shape. Ainda assim, graças à regra do primeiro membro e à conversão para o tipo base, 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 incorporado com initial_color)
    
    // TODO: Chame set_color com o retângulo convertido para Shape*
    // para mudar 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