On Thursday, 7 March 2024 at 22:18:40 UTC, Richard (Rikki) Andrew
Cattermole wrote:
There are two ways to do this.
1. Use templates.
https://tour.dlang.org/tour/en/basics/templates
2. Use a factory function.
https://tour.dlang.org/tour/en/basics/delegates
```d
class Map(ATile : Tile) {
ATile[] tiles;
}
```
Thank you. Is this first example you gave the template? Is the
syntax `(ATile : Tile)` saying that ATile must be a derived class
of Tile? If this isn't worse in any way than your second example,
then I don't know why I wouldn't choose this one.
I suppose that if I do this, then the derived class `Mission`
would be declared like `class Mission : Map(GridTile)`, right?
When I tried adding that parameter to the Map class, on
attempting to build it it complained that references to Map in
other classes were incomplete, as they didn't include a
parameter. I suppose I must make my other classes templates too.
Something strange that I just realized is that (without doing any
of the changes you suggested to me), I have a reference to a Map
object as one of the class variables in Unit, yet it has allowed
me to place a Mission object in it's place. It no longer allows
me if I change it to a pointer. Why is it sometimes possible to
put a derived class in a place meant for the class it inherits
from?