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.
Desafio
FácilVamos 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 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 ambas as 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 sua cor herdada.main.c: Crie umRecte inicialize todos os seus campos. Em seguida, demonstre o upcasting chamandoset_colorcom seu retângulo convertido paraShape*. 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: 7Onde 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
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online