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.
Desafio
FácilVamos 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 structShapecom um único campocolor(um inteiro). Em seguida, defina uma structRectque incorporaShapecomo seu primeiro membro e adiciona os camposwidtheheight(ambos inteiros). Declare duas funções:set_color, que recebe umShape*e um novo valor de cor, eprint_rect, que recebe umRect*.shape.c: Implemente as duas funções. Sua funçãoset_colortrabalha com o tipo base. Ela modifica a cor de qualquer forma. Sua funçãoprint_rectexibe todas as informações do retângulo, incluindo a cor herdada.main.c: Crie umRecte inicialize todos os seus campos. Em seguida, demonstre a conversão para o tipo base chamandoset_colorcom seu retângulo convertido paraShape*. 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: 7Em 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
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online