Wederom een vraagje over templates, ik ben er nog niets zo'n ongeloofelijke held in.
Stel heb een abstracte base class 'collection' en twee derived classes 'list' en 'tree'. Misschien zelfs enkele andere implementaties met elk zijn voor en nadelen. De base class is een generieke interface naar enkele concrete implementaties van een lijstachtige data structuur. Elke collection implementatie ondersteunt methods zoals insert, delete, select, etc.
Code snapshot van base class:
Code snapshot van list en tree class:
Nu heb ik ergens in mijn programma een collectie van bijvoorbeeld modules nodig. Voordat een modules in een lijst toegevoegd mogen worden, moeten er een aantal checks gedaan worden. Dit zou ik willen doen door een derived class module_collection te maken en de insert method er ongeveer zo uit te laten zien:
Maar... nu komt het. Ik wil deze module_collection niet laten deriven van een list of een tree of een andere gespecificeerde implementatie. Ik wil deze module_collection een derived class laten zijn van een willekeurige collection. Ik weet echter niet of en hoe dit kan.
Ik dacht zelf aan zoiets, maar dit schijnt niet te mogen:
Iemand enige idee of deze vorm van polymorphisme ongeveer op deze manier te implementeren is in C++, of dat ik dit op een hele andere 'mooie' manier kan oplossen?
Stel heb een abstracte base class 'collection' en twee derived classes 'list' en 'tree'. Misschien zelfs enkele andere implementaties met elk zijn voor en nadelen. De base class is een generieke interface naar enkele concrete implementaties van een lijstachtige data structuur. Elke collection implementatie ondersteunt methods zoals insert, delete, select, etc.
Code snapshot van base class:
C++:
1
2
3
4
5
6
7
8
| template <class Data, class Key> class collection { ... virtual void insert (Data *data, Key *key) = 0; virtual Data *select (Key key) = 0; ... }; |
Code snapshot van list en tree class:
C++:
Moge dat duidelijk zijn.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| template <class Data, class Key> class list : collection { ... void insert (Data *data, Key *key) { /* insert into internal linked list */ } ... }; template <class Data, class Key> class tree : collection { ... Data *select (Key key) { /* select item from internal binary tree */ } ... }; |
Nu heb ik ergens in mijn programma een collectie van bijvoorbeeld modules nodig. Voordat een modules in een lijst toegevoegd mogen worden, moeten er een aantal checks gedaan worden. Dit zou ik willen doen door een derived class module_collection te maken en de insert method er ongeveer zo uit te laten zien:
C++:
1
2
3
4
5
6
7
8
| void insert (Data *data, Key *key) { if (data == OK) { log("new module added"); super::insert(data, key) } else throw nare_exception(); } |
Maar... nu komt het. Ik wil deze module_collection niet laten deriven van een list of een tree of een andere gespecificeerde implementatie. Ik wil deze module_collection een derived class laten zijn van een willekeurige collection. Ik weet echter niet of en hoe dit kan.
Ik dacht zelf aan zoiets, maar dit schijnt niet te mogen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| template <class Data, class Key, class Base> class module_collection : Base<Data, Key> { ... }; /* als ik dan een module_collection als list wil: */ collection<module, mod_name> *mods = new module_collection<module, mod_name, list>; /* of als tree */ collection<module, mod_name> *mods = new module_collection<module, mod_name, tree>; |
Iemand enige idee of deze vorm van polymorphisme ongeveer op deze manier te implementeren is in C++, of dat ik dit op een hele andere 'mooie' manier kan oplossen?