Generics tutorial on Rule
This commit is contained in:
		| @@ -7,6 +7,27 @@ import ( | ||||
| ) | ||||
|  | ||||
| // A Rule implements an operation run on every game turn. | ||||
| // | ||||
| // Rule[C] is a generic interface. Like any other generic type, it describes a | ||||
| // family of related types: each different kind of StatsCollection that Rule | ||||
| // could pertain to is the basis of a distinct type of Rule. | ||||
| // | ||||
| // When implementing a generic interface, you do not need to implement a | ||||
| // generic type. In the case of Rule, you are likely to be writing rules for a | ||||
| // specific simulation. That simulation will have some associated | ||||
| // StatsCollection type. The rules you write will only need to implement the | ||||
| // variation of Rule that pertains specifically to that type. | ||||
| // | ||||
| // For example, if your `StatsCollection` type is `KoboldMineData`, then rules | ||||
| // for the simulation referring to it would implement `Rule[KoboldMineData]` | ||||
| // only. So the `Enact` function you implment would take an argument of type | ||||
| // `*Player[KoboldMineData]`, not some undefined type `C` that could be any | ||||
| // StatsCollection. Since it takes a `*Player[KoboldMineData]` as an argument, | ||||
| // you then know that the player's `Stats` field is not just any | ||||
| // StatsCollection, it is KoboldMineData specifically. The compiler won't | ||||
| // require you to convert from "some `StatsCollection`" to "`KoboldMineData` | ||||
| // specifically" when using the `Player[KoboldMineData].Stats` field, | ||||
| // because the type of that field is already `KoboldMineData`. | ||||
| type Rule[C StatsCollection] interface { | ||||
| 	// Label is an internal name the rule can be recognized by. | ||||
| 	// Some things may be easier if it is unique, but it does not have to be. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user