Recapitulação: Hierarquia de Formas
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 32 de 61.
Desafio
FácilVamos construir uma hierarquia de formas completa que demonstra o poder da herança via composição. Você criará um tipo base Shape do qual qualquer forma específica pode herdar e, em seguida, construirá um Rect que o estende.
Você organizará seu código em três arquivos:
shape.h: Defina sua hierarquia de structs com include guards. 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_colorque recebe umShape*e um novo valor de cor, eprint_rectque 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 para umShape*. Por fim, imprima o retângulo para verificar se a cor foi alterada através do ponteiro do tipo base.
Você receberá quatro entradas: a largura (width) do retângulo, sua altura (height), uma cor inicial (initial color) e uma nova cor (new color) para definir através da função genérica.
No seu arquivo principal, crie o retângulo com os valores iniciais, use set_color para alterar sua cor para o novo valor (lembre-se de converter seu Rect* para Shape*) e, finalmente, chame print_rect para exibir o resultado.
Sua saída deve ser parecida com esta:
Width: 10
Height: 5
Color: 7Onde 10 é a largura, 5 é a altura e 7 é a cor atualizada (não a cor inicial). O ponto fundamental aqui é que set_color não sabe nada sobre retângulos — ela funciona apenas com Shape. No entanto, através da regra do primeiro membro e do upcasting, a cor do seu retângulo é modificada por meio desta 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 da Shape incorporada 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 Object Oriented Programming
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írculo