Podsumowanie: hierarchia kształtów
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 32 z 61.
Wyzwanie
ŁatwyZbudujmy kompletną hierarchię kształtów, która pokazuje, jak działa dziedziczenie przez kompozycję. Utworzysz bazowy typ Shape, po którym będzie mogła dziedziczyć każda konkretna figura, a następnie zbudujesz typ Rect, który go rozszerza.
Rozmieścisz swój kod w trzech plikach:
shape.h: Zdefiniuj hierarchię struktur i strażniki dołączania. Utwórz strukturęShapez jednym polemcolor(liczbą całkowitą). Następnie zdefiniuj strukturęRect, która osadzaShapejako swój pierwszy element i dodaje polawidthorazheight(oba typu całkowitego). Zadeklaruj dwie funkcje:set_color, która przyjmujeShape*i nową wartość koloru, orazprint_rect, która przyjmujeRect*.shape.c: Zaimplementuj obie funkcje. Funkcjaset_colordziała z typem bazowym. Zmienia kolor dowolnego kształtu. Funkcjaprint_rectwyświetla wszystkie informacje o prostokącie, w tym odziedziczony kolor.main.c: UtwórzRecti zainicjalizuj wszystkie jego pola. Następnie zademonstruj rzutowanie w górę, wywołującset_colorz prostokątem rzutowanym naShape*. Na koniec wyświetl prostokąt, aby sprawdzić, czy kolor został zmieniony za pośrednictwem wskaźnika typu bazowego.
Otrzymasz cztery dane wejściowe: szerokość prostokąta, jego wysokość, kolor początkowy oraz nowy kolor, który należy ustawić za pomocą funkcji ogólnej.
W pliku głównym utwórz prostokąt z wartościami początkowymi, a następnie użyj set_color, aby zmienić jego kolor na nową wartość (pamiętaj, aby rzutować Rect* na Shape*), i na koniec wywołaj print_rect, aby wyświetlić wynik.
Wynik powinien wyglądać tak:
Width: 10
Height: 5
Color: 7Gdzie 10 to szerokość, 5 to wysokość, a 7 to zaktualizowany kolor (nie kolor początkowy). Kluczowe jest to, że set_color nic nie wie o prostokątach. Działa tylko z typem Shape. Jednak dzięki regule pierwszego elementu i rzutowaniu w górę kolor prostokąta zostaje zmieniony za pomocą tej funkcji ogólnej.
Spróbuj swoich sił
#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: Utwórz Rect i zainicjalizuj wszystkie jego pola
// (width, height oraz kolor osadzonej struktury Shape wartością initial_color)
// TODO: Wywołaj set_color, rzutując prostokąt na Shape*
// aby zmienić kolor na new_color
// TODO: Wywołaj print_rect, aby wyświetlić wynik
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online