Interfejs IMesh, klasa Mesh i loadery.
Nawiązując do poprzedniej notki chcę tylko zamieścić jak wyglądają klasy, które napisałem i czemu są takie fajne:
// Interfejs class IMesh { public: /* ... */ // Funkcja aktualizująca mesha virtual void SetMesh(LPD3DXMESH mesh) = 0; // Funkcja dodająca materiał do wektora virtual void AddMaterial(const Material& mat) = 0; // Funkcja zwraca materiał o podanym indeksie virtual Material GetMaterial(Dword index) = 0; /* ... */ }; // Główna klasa Mesh class Mesh : public IMesh { public: // Konstruktor Mesh(); // Destruktor ~Mesh(); public: /* Funkcje używane do rysowania modelu ... */ protected: /* ... */ // Funkcja aktualizująca mesha virtual void SetMesh(LPD3DXMESH mesh) = 0; // Funkcja dodająca materiał do wektora virtual void AddMaterial(const Material& mat) = 0; // Funkcja zwraca materiał o podanym indeksie virtual Material GetMaterial(Dword index) = 0; /* ... */ }; // Przykład loadera class X_file { public: // Konstruktor X_file(IMesh* mesh) { m_mesh = mesh; } // Funkcja ładująca RESULT LoadMesh(String filename) { LPD3DXMESH mesh; /* ... cuda-niewidy... */ m_mesh->AddMesh(mesh); // Wywołanie funkcji interfejsu } private: // Obiekt na którym działam IMesh* m_mesh; }; |
Nie lubię się rozpisywać. Jak można zauważyć dzięki interfejsowi IMesh można załadować dowolny model do klasy Mesh, ponieważ są publiczne wszystkie funkcje umożliwiające to zadanie, natomiast klasa Mesh posiada publiczne funkcje służące tylko i wyłącznie do rysowania modelu. Dzięki takiemu rozwiązaniu kod jest przejrzysty.
Reg:
A Mesh nie dziedziczy czasem po IMesh?
15 February 2009, 10:45 amRiddlemaster:
“Interfejsy” faktycznie są fajne, bo kod jest przejrzysty i elastyczny (zwłaszcza jak Mesh dziedziczyłoby po IMesh ;) ). Natomiast ja ostatnio oszalałem na punkcie polimorfizmu statycznego i polis.
15 February 2009, 7:55 pmNetrix:
Faktycznie, ugryzłem ten kawałek, dzięki za zwrócenie uwagi.
Ja również korzystam z polimorfizmu dość często. W zasadzie cały silnik na nim opieram :).
16 February 2009, 2:04 am