Rückblick: Formenhierarchie
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 32 von 61.
Aufgabe
EinfachErstellen wir eine vollständige Hierarchie von Formen, die die Leistungsfähigkeit von Vererbung durch Komposition demonstriert. Du erstellst einen Basistyp Shape, von dem jede spezifische Form erben kann, und baust anschließend ein Rect, das diesen erweitert.
Du organisierst deinen Code über drei Dateien:
shape.h: Definiere deine Struct-Hierarchie mit Include-Guards. Erstelle einShape-Struct mit einem einzigencolor-Feld (einer Ganzzahl). Definiere anschließend einRect-Struct, dasShapeals erstes Mitglied einbettet und die Felderwidthundheight(beide Ganzzahlen) hinzufügt. Deklariere zwei Funktionen:set_color, die einenShape*und einen neuen Farbwert entgegennimmt, sowieprint_rect, die einenRect*entgegennimmt.shape.c: Implementiere beide Funktionen. Deine Funktionset_colorarbeitet mit dem Basistyp. Sie ändert die Farbe jeder Form. Deine Funktionprint_rectgibt alle Informationen des Rechtecks einschließlich seiner geerbten Farbe aus.main.c: Erstelle einRectund initialisiere alle seine Felder. Demonstriere anschließend das Upcasting, indem duset_colormit deinem in einenShape*umgewandelten Rechteck aufrufst. Gib schließlich das Rechteck aus, um zu überprüfen, dass die Farbe über den Zeiger auf den Basistyp geändert wurde.
Du erhältst vier Eingaben: die width des Rechtecks, seine height, eine initiale Farbe und eine neue Farbe, die über die generische Funktion gesetzt werden soll.
Erstelle in deiner Hauptdatei das Rechteck mit den Anfangswerten. Verwende dann set_color, um seine Farbe auf den neuen Wert zu ändern (denke daran, deinen Rect* in einen Shape* umzuwandeln), und rufe schließlich print_rect auf, um das Ergebnis anzuzeigen.
Deine Ausgabe sollte so aussehen:
Width: 10
Height: 5
Color: 7Dabei ist 10 die Breite, 5 die Höhe und 7 die aktualisierte Farbe (nicht die Anfangsfarbe). Die entscheidende Erkenntnis ist, dass set_color nichts über Rechtecke weiß. Die Funktion arbeitet ausschließlich mit Shape. Durch die Regel für das erste Mitglied und das Upcasting wird die Farbe deines Rechtecks jedoch über diese generische Funktion geändert.
Probier es selbst
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: Erstelle ein Rect und initialisiere alle seine Felder
// (width, height und die Farbe des eingebetteten Shape mit initial_color)
// TODO: Rufe set_color mit dem zu Shape* gecasteten Rechteck auf
// um die Farbe zu new_color zu ändern
// TODO: Rufe print_rect auf, um das Ergebnis anzuzeigen
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