Und irgendwie äußerst hässlich, dass
Data 'polymorph' ist.
Durch virtuelle Funktionen kannst du polymorphe Objekte benutzen, ohne ihren Typ zu kennen. In diesem Beispiel ist das Problem, dass gleich 2 Objekte für die Kollision polymorph sind, aber man kann das z.B. so lösen:
|
C-/C++-Quelltext
|
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
|
bool BoxBox(*Box, *Box)
bool BoxSphere(...)
bool SphereSphere(...)
class Collider
{
bool CollideWith(Collider*)
};
class Box : public Collider
{
bool CollideWithBox(Box*, b)
{
return BoxBox(this, b)
}
bool CollideWithSphere(Sphere*) ...
bool CollideWith(Collider* c) override
{
c->CollideWithBox(this)
}
};
class Box : public Collider
{
bool CollideWithBox(Box*) ...
bool CollideWithSphere(Sphere*) ...
bool CollideWith(Collider* c) override ...
};
|
Du hast also 2 Funktionsaufrufe. Der erste 'sortiert' nach dem ersten Parametertyp, der zweite nach dem zweiten. Fortan hast du also nur noch 2 Colliderobjekte, von denen du gar nichts wissen musst, du kannst
Collider1->CollideWith(Collider2) aufrufen und es wird automatisch die Richtige Routine aufgerufen die dann auch direkt einen konkreten Untertypen (Box oder Sphere) bekommt, mit dem sie arbeiten kann.
Ein Nachteil ist hier noch, dass du alles doppelt machen musst: Sphere/Box und Box/Sphere sind eben 2 unterschiedliche Fällt, weil die Box einmal der zweite und einmal der erste Parameter ist.
Beachte, dass der Code nur grob skizziert ist, aber ich hoffe man kann erkennen, worauf es hinaus läuft. Vielleicht hat hier jemand auch noch eine hübschere Idee dazu, das ist ja ansich ein bekanntes Problem (aber ich hab halt gerade keinen Link zur Hand).