Předpokládejme, že chceme vytvořit komponentu, která bude umět generovat pseudonáhodná čísla v intervalu od 0 do 32767. Aby řady generovaných čísel nebyly vždy stejné, umožníme inicializaci generátoru nějakou startovací hodnotou. Řešení si nejprve ukážeme v „čistém“ C++, tedy bez použití a dodržení specifikace COM.
Rozhraní komponenty bychom mohli v C++ popsat abstraktní třídou IRandom, která má dvě metody. Metoda Start určuje inicializační hodnotu generátoru a metoda Next poskytuje další pseudonáhodné číslo v řadě.
![]() | Příklad 4.1. Rozhraní IRandom.h |
struct IRandom { virtual void Start(int seed) = 0; virtual int Next() = 0; }; |
Znaky "= 0" za hlavičkami metod říkají, že tyto metody jsou abstraktní a nemají tedy žádnou implementaci. Třída obsahující abstraktní metody musí být implementována jinou konkrétní třídou, která zdědí toto rozhraní a všechny abstraktní metody implementuje.
Nyní již můžeme generátor náhodných čísel použít v testovací aplikaci. Ta například provede nastartování generátoru nějakou konkrétní hodnotou a zobrazí prvních deset vygenerovaných čísel.
Nejprve tedy vytvoříme samotnou komponentu a získáme ukazatel na rozhraní, pomocí kterého budeme dále s komponentou komunikovat. Až nebudeme komponentu dále potřebovat, zrušíme ji.
![]() | Úkol k zamyšlení |
Zamyslete se nad tím, které vlastnosti uvedeného řešení brání tomu, aby mohla být aplikace zcela nezávislá na implementaci komponenty, a pokuste se navrhnout řešení. Proč do kódu aplikace vkládáme záhlaví RandomImpl.h a ne pouze IRandom.h? Jaké problémy nastanou, pokud komponentu bude současně používat více klientů? | |