Menu
Coddy logo textTech

Polymorphe Verwendung

Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 47 von 61.

challenge icon

Aufgabe

Einfach

Lassen Sie uns beweisen, dass Polymorphismus wirklich funktioniert, indem wir eine Funktion schreiben, die jede Form über den Basis-Shape*-Pointer verarbeiten kann — egal, ob es sich um einen Circle oder ein Rectangle handelt.

Aufbauend auf Ihren bestehenden Circle- und Rectangle-Implementierungen werden Sie eine leistungsstarke Abstraktion hinzufügen: eine einzige Funktion, die mit jedem Formtyp einheitlich arbeitet.

Ihr Projekt wird diese Dateien enthalten:

  • shape.h: Ihr Basis-Shape-Interface mit den Typen DrawFunc und AreaFunc.
  • circle.h und circle.c: Ihre Circle-Implementierung aus der vorherigen Lektion.
  • rectangle.h und rectangle.c: Ihre Rectangle-Implementierung aus der vorherigen Lektion.
  • shape.c: Implementieren Sie eine neue Funktion namens process_shape, die einen Shape*-Pointer entgegennimmt. Diese Funktion sollte die draw-Funktion der Form aufrufen, dann ihre area-Funktion aufrufen und das Ergebnis mit 2 Dezimalstellen im Format Area: X.XX ausgeben.
  • main.c: Demonstrieren Sie Polymorphismus in Aktion. Lesen Sie einen Indikator für den Formtyp (c für Circle, r für Rectangle), gefolgt von den erforderlichen Dimensionen. Erstellen Sie die entsprechende Form und übergeben Sie dann einen Pointer auf deren eingebettetes Shape-Member an process_shape. Dieselbe Funktion verarbeitet beide Typen!

Ihr Programm erhält entweder:

  • c gefolgt von einem Radiuswert, oder
  • r gefolgt von Werten für Breite und Höhe

Beispielhafte Ausgabe, wenn die Eingaben c und 5.0 sind:

Drawing Circle with radius: 5.00
Area: 78.54

Beispielhafte Ausgabe, wenn die Eingaben r, 4.0 und 3.0 sind:

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

Das Magische hierbei ist, dass process_shape keine Ahnung hat, ob es mit einem Circle oder Rectangle arbeitet — es kennt nur das Shape-Interface. Indem Sie das eingebettete Shape-Member Ihrer konkreten Form in einen Shape* casten, können Sie jeden Formtyp an diese eine Funktion übergeben. Das ist Polymorphismus: eine Funktion, mehrere Verhaltensweisen basierend auf dem tatsächlichen Objekttyp.

Denken Sie daran, process_shape in shape.h zu deklarieren, damit sie von main.c aus aufgerufen werden kann.

Probier es selbst

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

int main() {
    // TODO: Lies ein Zeichen für den Formtyp ein ('c' für circle, 'r' für rectangle)
    // TODO: Wenn 'c', lies den Radius ein, erstelle einen Circle und rufe process_shape mit dessen Basis auf
    // TODO: Wenn 'r', lies Breite und Höhe ein, erstelle ein Rectangle und rufe process_shape mit dessen Basis auf
    return 0;
}

Alle Lektionen in Object Oriented Programming