Menu
Coddy logo textTech

Rückblick: Formenhierarchie

Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 32 von 61.

challenge icon

Aufgabe

Einfach

Lassen 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 ein Shape-Struct mit einem einzelnen color-Feld (ein Integer). Definieren Sie dann ein Rect-Struct, das Shape als sein erstes Mitglied einbettet und die Felder width und height (beides Integer) hinzufügt. Deklarieren Sie zwei Funktionen: set_color, die einen Shape* und einen neuen Farbwert entgegennimmt, und print_rect, die einen Rect* entgegennimmt.
  • shape.c: Implementieren Sie beide Funktionen. Ihre set_color-Funktion arbeitet mit dem Basis-Typ – sie modifiziert die Farbe jeder Form. Ihre print_rect-Funktion zeigt alle Informationen des Rechtecks an, einschließlich seiner geerbten Farbe.
  • main.c: Erstellen Sie ein Rect und initialisieren Sie alle seine Felder. Demonstrieren Sie dann das Upcasting, indem Sie set_color mit Ihrem auf einen Shape* 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: 7

Wobei 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