Menu
Coddy logo textTech

Polymorphe Verwendung

Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 47 von 61.

challenge icon

Aufgabe

Einfach

Beweisen wir, dass Polymorphie tatsächlich funktioniert, indem wir eine Funktion schreiben, die über den beliebigen Zeiger Shape* der Basisklasse jede Form verarbeiten kann, unabhängig davon, ob es sich um einen Circle oder ein Rectangle handelt.

Aufbauend auf deinen bestehenden Circle- und Rectangle-Implementierungen fügst du eine leistungsfähige Abstraktion hinzu: eine einzelne Funktion, die einheitlich mit jedem Formtyp arbeitet.

Dein Projekt wird diese Dateien enthalten:

  • shape.h: Deine Shape-Schnittstelle der Basisklasse mit den Typen DrawFunc und AreaFunc.
  • circle.h und circle.c: Deine Circle-Implementierung aus der vorherigen Lektion.
  • rectangle.h und rectangle.c: Deine Rectangle-Implementierung aus der vorherigen Lektion.
  • shape.c: Implementiere eine neue Funktion namens process_shape, die einen Shape*-Zeiger entgegennimmt. Diese Funktion sollte die draw-Funktion der Form aufrufen, anschließend ihre area-Funktion aufrufen und das Ergebnis mit 2 Dezimalstellen im Format Area: X.XX ausgeben.
  • main.c: Zeige Polymorphie in Aktion. Lies einen Indikator für den Formtyp (c für Circle, r für Rectangle), gefolgt von den erforderlichen Abmessungen. Erzeuge die entsprechende Form und übergib anschließend einen Zeiger auf ihr eingebettetes Shape-Element an process_shape. Dieselbe Funktion verarbeitet beide Typen!

Dein Programm erhält entweder:

  • c, gefolgt von einem Radiuswert, oder
  • r, gefolgt von Breiten- und Höhenwerten

Beispielausgabe, wenn die Eingaben c und 5.0 sind:

Drawing Circle with radius: 5.00
Area: 78.54

Beispielausgabe, wenn die Eingaben r, 4.0 und 3.0 sind:

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

Das Entscheidende dabei ist, dass process_shape nicht weiß, ob es mit einem Circle oder einem Rectangle arbeitet. Es kennt nur die Shape-Schnittstelle. Indem du das eingebettete Shape-Element deiner konkreten Form in einen Shape* umwandelst, kannst du jeden Formtyp an diese einzelne Funktion übergeben. Das ist Polymorphie: eine Funktion, mehrere Verhaltensweisen, die auf dem tatsächlichen Objekttyp basieren.

Denke daran, process_shape in shape.h zu deklarieren, damit die Funktion aus main.c aufgerufen werden kann.

Probier es selbst

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

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

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C-Compiler