J'ai implémenté le code suivant de la recherche Breadth-First.Retour du même type que la fonction a été transmise
trait State{
def successors:Seq[State]
def isSuccess:Boolean = false
def admissableHeuristic:Double
}
def breadthFirstSearch(initial:State):Option[List[State]] = {
val open= new scala.collection.mutable.Queue[List[State]]
val closed = new scala.collection.mutable.HashSet[State]
open.enqueue(initial::Nil)
while (!open.isEmpty){
val path:List[State]=open.dequeue()
if(path.head.isSuccess) return Some(path.reverse)
closed += path.head
for (x <- path.head.successors)
if (!closed.contains(x))
open.enqueue(x::path)
}
return None
}
Si je définis un sous-type de State
pour mon problème particulier
class CannibalsState extends State {
//...
}
Quelle est la meilleure façon de faire breadthFirstSearch
retourner le même sous-type qui a été adopté?
Et si je change cela pour qu'il y ait 3 différentes classes d'état pour mon problème particulier et ils partagent un supertype commun:
abstract class CannibalsState extends State {
//...
}
class LeftSideOfRiver extends CannibalsState {
//...
}
class InTransit extends CannibalsState {
//...
}
class RightSideOfRiver extends CannibalsState {
//...
}
Comment puis-je faire les types fonctionnent de telle sorte que breadthFirstSearch
infère que le retour correct type est CannibalsState
lorsqu'il est passé une instance de LeftSideOfRiver
? Est-ce que cela peut être fait avec un membre de type abstrait, ou doit-il être fait avec des génériques?