Menu
Coddy logo textTech

Zastosowanie polimorfizmu

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 47 z 61.

challenge icon

Wyzwanie

Łatwy

Udowodnijmy, że polimorfizm naprawdę działa, pisząc funkcję, która może przetwarzać dowolny kształt za pomocą wskaźnika bazowego Shape*, niezależnie od tego, czy jest to Circle, czy Rectangle.

Rozbudowując istniejące implementacje Circle i Rectangle, dodasz potężną abstrakcję: pojedynczą funkcję, która działa jednolicie z dowolnym typem kształtu.

Twój projekt będzie zawierał następujące pliki:

  • shape.h: bazowy interfejs Shape z typami DrawFunc i AreaFunc.
  • circle.h i circle.c: implementacja Circle z poprzedniej lekcji.
  • rectangle.h i rectangle.c: implementacja Rectangle z poprzedniej lekcji.
  • shape.c: Zaimplementuj nową funkcję o nazwie process_shape, która przyjmuje wskaźnik Shape*. Funkcja powinna wywołać funkcję draw kształtu, a następnie jego funkcję area i wypisać wynik z dokładnością do 2 miejsc po przecinku w formacie Area: X.XX.
  • main.c: Zademonstruj działanie polimorfizmu. Wczytaj oznaczenie typu kształtu (c dla koła, r dla prostokąta), a następnie wymagane wymiary. Utwórz odpowiedni kształt, a następnie przekaż wskaźnik do osadzonego w nim elementu Shape do funkcji process_shape. Ta sama funkcja obsługuje oba typy!

Twój program otrzyma jedno z następujących wejść:

  • c, a po nim wartość promienia, lub
  • r, a po nim wartości szerokości i wysokości

Przykładowe wyjście, gdy dane wejściowe to c i 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Przykładowe wyjście, gdy dane wejściowe to r, 4.0 i 3.0:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

Cała sztuczka polega na tym, że process_shape nie wie, czy działa z Circle, czy z Rectangle. Zna tylko interfejs Shape. Rzutując osadzony element Shape konkretnego kształtu na Shape*, możesz przekazać dowolny typ kształtu do tej jednej funkcji. To właśnie polimorfizm: jedna funkcja, wiele zachowań zależnych od rzeczywistego typu obiektu.

Pamiętaj, aby zadeklarować process_shape w shape.h, tak aby można było wywołać ją z main.c.

Spróbuj swoich sił

#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Wczytaj znak określający typ figury ('c' dla koła, 'r' dla prostokąta)
    // TODO: Jeśli 'c', wczytaj promień, utwórz Circle i wywołaj process_shape, przekazując jego część bazową
    // TODO: Jeśli 'r', wczytaj szerokość i wysokość, utwórz Rectangle i wywołaj process_shape, przekazując jego część bazową
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online