Hallo,
Ik heb een vraagbetreft een OO implementatie van een C++ programma.
Gegeven een Base en een Derived klasse. Daarnaast een 'manager' die alleen de Base kent.
Nu wil ik in mijn programma via de 'manager' Base objecten opvragen en die benaderen als Derived (hoe ik weet dat ze van type derived zijn is nu even buiten scope).
Als ik vanuit mijn manager als pointer return en dan (evt dynamic) cast naar Derived, dan bega ik een grove OO violation: een pointer naar een private member, toch?
Als ik ze via een reference return en cast, dan heb ik een onoverzichtelijke, onduidelijke syntax.
Zie ik iets over het hoofd, of is dit gewoon bad design?
Ik heb een vraagbetreft een OO implementatie van een C++ programma.
Gegeven een Base en een Derived klasse. Daarnaast een 'manager' die alleen de Base kent.
Nu wil ik in mijn programma via de 'manager' Base objecten opvragen en die benaderen als Derived (hoe ik weet dat ze van type derived zijn is nu even buiten scope).
Als ik vanuit mijn manager als pointer return en dan (evt dynamic) cast naar Derived, dan bega ik een grove OO violation: een pointer naar een private member, toch?
Als ik ze via een reference return en cast, dan heb ik een onoverzichtelijke, onduidelijke syntax.
Zie ik iets over het hoofd, of is dit gewoon bad design?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| class MyBase { public: MyBase(); void set(int x); int get(void); //... }; class MyDerived : public MyBase { public: MyDerived(); void special(int y); //... }; class MyManager{ //MyManager kent alleen MyBase public: MyManager(); MyBase& getObjectByRef(int i) {return *myBases[i];} //By reference MyBase* getObjectPtr(int i) {return myBases[i];} //Pointer private: MyBase *myBases[10]; } void main() { MyDerived * derivedObj; MyManager * manager = new MyManager(); //optie 1: ((MyDerived&)manager->getObjectByRef(0)).special(1); //goed? lange syntax, onduidelijk dat reference //optie 2: ((MyDerived *) derivedObj = ((MyDerived *) manager->getObject(0)); //fout, OO-wise? derivedObj->special(1); derivedObj->special(2); derivedObj->special(3); } |