У меня этот прецедент я не могу решить. Я думал о среде для программирования передачи сообщений. Существуют две основные концепции: Вещи и окружающая среда: Вещи, как в реальном мире. Они могут быть пассивными или активными, и они могут отправлять и получать сообщения. Окружающая среда позволяет общаться между вещами. я пришел к этому решению:Проверка класса Scala во время выполнения
/**** Thing.scala ****/
abstract class Thing(environment : Environment){
val uniqueName : String
require(environment != null)
}
/**** ActiveThing.scala ****/
trait ActiveThing extends Thing {
environment.register(this)
type inputType
type outputType
def receiveMessage(message : Message[inputType]) : outputType
def canReceiveMessage(subject : String) : Boolean
}
/**** **** Environment.scala/
trait Environment {
private var _passiveThings = List[PassiveThing]()
private var _activeThings = List[ActiveThing]()
def activeThings = _activeThings.toSeq
def passiveThings = _passiveThings.toSeq
def register(p : PassiveThing) = _passiveThings +:= p
def register(a : ActiveThing) = _activeThings +:= a
def unicastRequest[T,K](from : String, message : Message[T], to : String) : K
}
/**** **** Message.scala/
case class Message[T](subject : String, body : T)
Но когда я пытаюсь реально выполнить:
/**** EchoActiveThing.scala ****/
class EchoActiveThing(implicit inj: Injector) extends Thing()(inj) with ActiveThing {
type inputType = String
type outputType = String
val uniqueName : String = "Echo"
def receiveMessage(message : Message[inputType]) : outputType = {
message.body
}
def canReceiveMessage(subject : String) : Boolean = {
true
}
}
/**** BasicEnvironment.scala ****/
class BasicEnvironment extends Environment {
def unicastRequest[T,K](from : String, message : Message[T], to : String) : K = {
activeThings.filter{ x =>
x.inputType == T &&
x.outputType == K &&
x.canReceiveMessage(message) &&
activeThings.contains(to.uniqueName)
}
}
}
Но это не скомпилировать. Я думаю, что я не подхожу к проблеме правильно! Спасибо