Menu
Coddy logo textTech

Uso Polimórfico

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 47 de 61.

challenge icon

Desafio

Fácil

Vamos 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 base Shape com os tipos DrawFunc e AreaFunc.
  • circle.h e circle.c: Sua implementação de Circle da lição anterior.
  • rectangle.h e rectangle.c: Sua implementação de Rectangle da lição anterior.
  • shape.c: Implemente uma nova função chamada process_shape que recebe um ponteiro Shape*. Esta função deve chamar a função draw da forma, depois chamar sua função area e imprimir o resultado com 2 casas decimais no formato Area: X.XX.
  • main.c: Demonstre o polimorfismo em ação. Leia um indicador de tipo de forma (c para círculo, r para retângulo) seguido pelas dimensões necessárias. Crie a forma apropriada e, em seguida, passe um ponteiro para seu membro Shape incorporado para process_shape. A mesma função lida com ambos os tipos!

Seu programa receberá:

  • c seguido por um valor de raio, ou
  • r seguido 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.54

Exemplo 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.00

A 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