Uso polimórfico
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 47 de 61.
Desafio
FácilVamos provar que o polimorfismo realmente funciona escrevendo uma função que pode processar qualquer forma por meio do ponteiro base Shape*, seja um círculo ou um retângulo.
Com base nas implementações existentes de Circle e Rectangle, você adicionará uma abstração poderosa: uma única função que trabalha uniformemente com qualquer tipo de forma.
Seu projeto incluirá estes arquivos:
shape.h: Sua interface baseShapecom os tiposDrawFunceAreaFunc.circle.hecircle.c: Sua implementação de Circle da lição anterior.rectangle.herectangle.c: Sua implementação de Rectangle da lição anterior.shape.c: Implemente uma nova função chamadaprocess_shapeque recebe um ponteiroShape*. Essa função deve chamar a funçãodrawda forma, depois chamar sua funçãoareae imprimir o resultado com 2 casas decimais no formatoArea: X.XX.main.c: Demonstre o polimorfismo em ação. Leia um indicador do tipo de forma (cpara círculo,rpara retângulo), seguido das dimensões necessárias. Crie a forma apropriada e, em seguida, passe um ponteiro para seu membroShapeembutido paraprocess_shape. A mesma função trata ambos os tipos!
Seu programa receberá uma destas opções:
cseguido de um valor de raio, ourseguido de valores de largura e altura
Exemplo de saída quando as entradas são c e 5.0:
Drawing Circle with radius: 5.00
Area: 78.54Exemplo de saída quando as entradas são r, 4.0 e 3.0:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00A mágica aqui é que process_shape não sabe se está trabalhando com um Circle ou um Rectangle. Ela conhece apenas a interface Shape. Ao converter o membro Shape embutido da sua forma concreta para um Shape*, você pode passar qualquer tipo de forma para essa única função. Isso é polimorfismo: uma função, vários comportamentos com base no tipo real do objeto.
Lembre-se de declarar process_shape em shape.h para que ela possa ser chamada de main.c.
Experimente você mesmo
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: Leia um char para o tipo de forma ('c' para círculo, 'r' para retângulo)
// TODO: Se 'c', leia o raio, crie um Circle e chame process_shape com sua base
// TODO: Se 'r', leia a largura e a altura, crie um Rectangle e chame process_shape com sua base
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