Uso Polimórfico
Parte da seção Object Oriented Programming 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 através do ponteiro base Shape* — seja um Circle ou um Rectangle.
Com base em suas implementações existentes de Circle e Rectangle, você adicionará uma abstração poderosa: uma única função que trabalha com qualquer tipo de forma uniformemente.
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*. Esta 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 de tipo de forma (cpara círculo,rpara retângulo) seguido pelas dimensões necessárias. Crie a forma apropriada e, em seguida, passe um ponteiro para seu membroShapeincorporado paraprocess_shape. A mesma função lida com ambos os tipos!
Seu programa receberá:
cseguido por um valor de raio, ourseguido por 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 tem ideia se está trabalhando com um Circle ou Rectangle — ela conhece apenas a interface Shape. Ao converter o membro Shape incorporado da sua forma concreta para um Shape*, você pode passar qualquer tipo de forma para esta única função. Isso é polimorfismo: uma função, múltiplos comportamentos baseados no tipo real do objeto.
Lembre-se de declarar process_shape em shape.h para que ela possa ser chamada a partir 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 circle, 'r' para rectangle)
// TODO: Se for 'c', leia o radius, crie um Circle e chame process_shape com sua base
// TODO: Se for 'r', leia width e height, crie um Rectangle e chame process_shape com sua base
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