Polymorphe Verwendung
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 47 von 61.
Aufgabe
EinfachLassen 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 TypenDrawFuncundAreaFunc.circle.hundcircle.c: Ihre Circle-Implementierung aus der vorherigen Lektion.rectangle.hundrectangle.c: Ihre Rectangle-Implementierung aus der vorherigen Lektion.shape.c: Implementieren Sie eine neue Funktion namensprocess_shape, die einenShape*-Pointer entgegennimmt. Diese Funktion sollte diedraw-Funktion der Form aufrufen, dann ihrearea-Funktion aufrufen und das Ergebnis mit 2 Dezimalstellen im FormatArea: X.XXausgeben.main.c: Demonstrieren Sie Polymorphismus in Aktion. Lesen Sie einen Indikator für den Formtyp (cfür Circle,rfür Rectangle), gefolgt von den erforderlichen Dimensionen. Erstellen Sie die entsprechende Form und übergeben Sie dann einen Pointer auf deren eingebettetesShape-Member anprocess_shape. Dieselbe Funktion verarbeitet beide Typen!
Ihr Programm erhält entweder:
cgefolgt von einem Radiuswert, oderrgefolgt 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.54Beispielhafte Ausgabe, wenn die Eingaben r, 4.0 und 3.0 sind:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00Das 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
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-Implementierung