Menu
Coddy logo textTech

Uso Polimórfico

Parte da seção Programação Orientada a Objetos 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 por meio do ponteiro base Shape*, seja ela um Circle ou um Rectangle.

Com base nas implementações existentes de Circle e Rectangle, você adicionará uma abstração poderosa: uma única função que funciona uniformemente com qualquer tipo de forma.

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*. Essa 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 a process_shape. A mesma função lida com os dois tipos!

Seu programa receberá uma destas opções:

  • 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 parte mágica é 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 incorporado 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 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 círculo, 'r' para retângulo)
    // TODO: Se 'c', leia o raio, crie um Circle e chame process_shape com a sua base
    // TODO: Se 'r', leia a largura e a altura, crie um Rectangle e chame process_shape com a sua base
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online