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 STEP
karelpeeters
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