Przegląd projektu
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 44 z 61.
Wyzwanie
ŁatwyStwórzmy podstawy projektu Shape Drawer, tworząc bazową strukturę Shape: interfejs, który definiuje, co może robić dowolny kształt, za pomocą wskaźników do funkcji.
Utworzysz dwa pliki, aby skonfigurować ten system polimorficzny:
shape.h: Zdefiniuj tutaj główny interfejs. Najpierw utwórz deklarację wstępną strukturyShape. Następnie zdefiniuj dwa typy wskaźników do funkcji:DrawFunc: przyjmuje parametrconst Shape*i niczego nie zwracaAreaFunc: przyjmuje parametrconst Shape*i zwraca wartość typudouble
Shape, zawierającą dwa wskaźniki do funkcji:draw(typuDrawFunc) iarea(typuAreaFunc). Ta struktura pełni wyłącznie funkcję interfejsu. Nie przechowuje żadnych danych dotyczących konkretnego kształtu, a jedynie jego zachowanie.main.c: Zademonstruj działanie interfejsu, tworząc prosty kształt testowy. Zaimplementuj dwie funkcje:test_draw: wypisujeDrawing test shapetest_area: zwraca42.0
Shape, połącz ją z tymi funkcjami testowymi, a następnie wywołaj obie funkcje za pośrednictwem interfejsu. Wypisz wynik obliczenia pola z jednym miejscem po przecinku.
Wynik powinien pokazać, że wskaźniki do funkcji działają poprawnie:
Drawing test shape
Area: 42.0Dlaczego deklaracja wstępna? Możesz się zastanawiać, dlaczego typedef struct Shape Shape; pojawia się przed pełną definicją struktury. Jest to konieczne, ponieważ typy DrawFunc i AreaFunc odwołują się do const Shape* w typach swoich parametrów, ale w tym miejscu pliku kompilator nie widział jeszcze pełnej definicji struktury. Deklaracja wstępna informuje kompilator: „istnieje struktura o nazwie Shape”, co wystarczy, aby użyć wskaźnika do niej. Pełna definicja pojawia się później. Ten wzorzec jest powszechny w C, gdy struktura musi odwoływać się do samej siebie (bezpośrednio lub za pośrednictwem wskaźników do funkcji).
Najważniejszy wniosek jest taki, że Shape nie wie nic o kołach ani prostokątach. Wie tylko, że każdy kształt musi umieć sam siebie draw i obliczać swoje area. W kolejnych lekcjach utworzysz konkretne kształty, które będą zawierać tę bazową strukturę i dostarczą własne implementacje. Pamiętaj, aby używać strażników dołączania w pliku nagłówkowym.
Spróbuj swoich sił
#include <stdio.h>
#include "shape.h"
// TODO: Zaimplementuj funkcję test_draw
// - Przyjmuje parametr const Shape*
// - Wypisuje "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: Wypisz wymagany komunikat
}
// TODO: Zaimplementuj funkcję test_area
// - Przyjmuje parametr const Shape*
// - Zwraca 42.0
double test_area(const Shape* shape) {
// TODO: Zwróć testową wartość pola
}
int main() {
// TODO: Utwórz instancję Shape
// TODO: Powiąż obiekt shape z funkcjami test_draw i test_area
// TODO: Wywołaj draw przez interfejs
// TODO: Wywołaj area przez interfejs i wypisz wynik z jednym miejscem po przecinku
// Format: "Area: %.1f\n"
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