Polymorphe Verwendung
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 47 von 61.
Aufgabe
EinfachBeweisen 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: DeineShape-Schnittstelle der Basisklasse mit den TypenDrawFuncundAreaFunc.circle.hundcircle.c: Deine Circle-Implementierung aus der vorherigen Lektion.rectangle.hundrectangle.c: Deine Rectangle-Implementierung aus der vorherigen Lektion.shape.c: Implementiere eine neue Funktion namensprocess_shape, die einenShape*-Zeiger entgegennimmt. Diese Funktion sollte diedraw-Funktion der Form aufrufen, anschließend ihrearea-Funktion aufrufen und das Ergebnis mit 2 Dezimalstellen im FormatArea: X.XXausgeben.main.c: Zeige Polymorphie in Aktion. Lies einen Indikator für den Formtyp (cfür Circle,rfür Rectangle), gefolgt von den erforderlichen Abmessungen. Erzeuge die entsprechende Form und übergib anschließend einen Zeiger auf ihr eingebettetesShape-Element anprocess_shape. Dieselbe Funktion verarbeitet beide Typen!
Dein Programm erhält entweder:
c, gefolgt von einem Radiuswert, oderr, gefolgt von Breiten- und Höhenwerten
Beispielausgabe, wenn die Eingaben c und 5.0 sind:
Drawing Circle with radius: 5.00
Area: 78.54Beispielausgabe, wenn die Eingaben r, 4.0 und 3.0 sind:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Das 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
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler