ghedeon
01/03/2019, 11:39 PMghedeon
01/03/2019, 11:40 PMabstract class FSM<STEP : FSM.Step<DATA>, DATA>(firstStep: STEP) {
var currentStep: STEP = firstStep
private set
fun next(data: DATA) {
currentStep = currentStep.next(data)
}
fun prev(data: DATA) {
currentStep = currentStep.prev(data)
}
interface Step<DATA> {
fun next(data: DATA): Step<DATA>
fun prev(data: DATA): Step<DATA>
}
}pavel
01/03/2019, 11:43 PMpavel
01/03/2019, 11:44 PMcurrentStep.next can return any subtype of Step<DATA and not just STEPkarelpeeters
01/03/2019, 11:45 PMabstract class FSM<STEP : FSM.Step<DATA, STEP>, DATA>(firstStep: STEP) {
var currentStep: STEP = firstStep
private set
fun next(data: DATA) {
currentStep = currentStep.next(data)
}
fun prev(data: DATA) {
currentStep = currentStep.prev(data)
}
interface Step<DATA, S: Step<DATA, S>> {
fun next(data: DATA): S
fun prev(data: DATA): S
}
}karelpeeters
01/03/2019, 11:45 PMStep to Step<DATA, S: Step<DATA, S>> and change FSM accordingly.ghedeon
01/03/2019, 11:50 PMStep<DATA, out S : Step<DATA, S>>?karelpeeters
01/03/2019, 11:51 PMDico
01/04/2019, 12:49 AMcurrentStep as Step<DATA>
I think complex type relations should be avoided.ghedeon
01/04/2019, 12:55 AMcurrentStep is public, so the usage is going to be strange. You feed your subclassed steps to FSM, but it gives you the superclass current.Dico
01/04/2019, 1:06 AM