Rückblick: Formenhierarchie
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 32 von 61.
Aufgabe
EinfachLassen Sie uns eine vollständige Formenhierarchie aufbauen, die die Leistungsfähigkeit der Vererbung durch Komposition demonstriert. Sie erstellen einen Basis-Typ Shape, von dem jede spezifische Form erben kann, und bauen dann ein Rect auf, das diesen erweitert.
Sie werden Ihren Code über drei Dateien organisieren:
shape.h: Definieren Sie Ihre Struct-Hierarchie mit Include-Guards. Erstellen Sie einShape-Struct mit einem einzelnencolor-Feld (ein Integer). Definieren Sie dann einRect-Struct, dasShapeals sein erstes Mitglied einbettet und die Felderwidthundheight(beides Integer) hinzufügt. Deklarieren Sie zwei Funktionen:set_color, die einenShape*und einen neuen Farbwert entgegennimmt, undprint_rect, die einenRect*entgegennimmt.shape.c: Implementieren Sie beide Funktionen. Ihreset_color-Funktion arbeitet mit dem Basis-Typ – sie modifiziert die Farbe jeder Form. Ihreprint_rect-Funktion zeigt alle Informationen des Rechtecks an, einschließlich seiner geerbten Farbe.main.c: Erstellen Sie einRectund initialisieren Sie alle seine Felder. Demonstrieren Sie dann das Upcasting, indem Sieset_colormit Ihrem auf einenShape*gecasteten Rechteck aufrufen. Drucken Sie schließlich das Rechteck aus, um zu überprüfen, ob die Farbe über den Basis-Typ-Pointer geändert wurde.
Sie erhalten vier Eingaben: die width des Rechtecks, seine height, eine initial color und eine new color, die über die generische Funktion gesetzt werden soll.
Erstellen Sie in Ihrer Hauptdatei das Rechteck mit den Initialwerten, verwenden Sie dann set_color, um seine Farbe auf den neuen Wert zu ändern (denken Sie daran, Ihren Rect* in einen Shape* zu casten), und rufen Sie schließlich print_rect auf, um das Ergebnis anzuzeigen.
Ihre Ausgabe sollte wie folgt aussehen:
Width: 10
Height: 5
Color: 7Wobei 10 die Breite ist, 5 die Höhe und 7 die aktualisierte Farbe (nicht die ursprüngliche Farbe). Die entscheidende Erkenntnis hierbei ist, dass set_color nichts über Rechtecke weiß – sie arbeitet nur mit Shape. Dennoch wird durch die Regel des ersten Mitglieds und das Upcasting die Farbe Ihres Rechtecks über diese generische Funktion modifiziert.
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 auf, wobei das Rechteck zu Shape* gecastet wird
// um die Farbe in new_color zu ändern
// TODO: Rufe print_rect auf, um das Ergebnis anzuzeigen
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