Menu
Coddy logo textTech

Rückblick: Formenhierarchie

Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 32 von 61.

challenge icon

Aufgabe

Einfach

Erstellen 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 ein Shape-Struct mit einem einzigen color-Feld (einer Ganzzahl). Definiere anschließend ein Rect-Struct, das Shape als erstes Mitglied einbettet und die Felder width und height (beide Ganzzahlen) hinzufügt. Deklariere zwei Funktionen: set_color, die einen Shape* und einen neuen Farbwert entgegennimmt, sowie print_rect, die einen Rect* entgegennimmt.
  • shape.c: Implementiere beide Funktionen. Deine Funktion set_color arbeitet mit dem Basistyp. Sie ändert die Farbe jeder Form. Deine Funktion print_rect gibt alle Informationen des Rechtecks einschließlich seiner geerbten Farbe aus.
  • main.c: Erstelle ein Rect und initialisiere alle seine Felder. Demonstriere anschließend das Upcasting, indem du set_color mit deinem in einen Shape* 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: 7

Dabei 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

Übe selbstständig: Online-C-Compiler