Скала: Как продлить актера Акка?

rapt спросил: 14 ноября 2017 в 06:03 в: scala

Я написал актера базы Akka, который может обрабатывать некоторые распространенные сообщения. Я хочу повторно использовать это базовое поведение в суб-акторе, расширяя базовый-актер (не составом базового-актера).

Я видел несколько подходов в предыдущих вопросах. Все они действительны, но также могут быть улучшены:

Как расширить поведение суперактера в akka

и

Как лучше всего рассказать о поведении актерам Akka?

Чтобы сделать реализацию более чистой, я пытаюсь добиться следующего:

  • При определении субактора я пытаюсь расширить только базовый актер (не оба Actor и sub-actor). Однако я не смог заставить компилятор сделать это.
  • Я также стараюсь не переименовывать частичную функцию receive, потому что это своего рода соглашение.
  • Вот пример моей реализации:

    //This is the base-actor that implements the common behaviortrait BetterActor extends Actor {  abstract override def receive = {
        super.receive orElse { case _ => println("Missing pattern!") }
      }
    }//This is the actor that implements the additional behavior.
    //I actually wanted to extend BetterActor. It was not possible.class MyActor extends Actor {  def receive = {
        case i: Int =>
          println(s"Yay!!! Got $i")
      }
    }
    

    Вот два альтернативных способа, как я могу создать экземпляр субактора, который сочетает в себе как общее, так и дополнительное поведение:

    //1.val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")//2.class MyBetterActor extends MyActor with BetterActor
    val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")
    

    Наконец, я могу вызвать субактора с помощью:

    myBetterActor ! 2
    myBetterActor ! "a"
    

    Проблемы с моей реализацией:

    Когда я создаю экземпляр субактора, только тогда я могу смешивать в base-actor, либо напрямую (1), либо путем определения нового класса, который смешивается в base-actor.

    Как я уже говорил, я бы предпочел смешивать в base-actor, когда я определить суб-субъект. Не тогда, когда я пытаюсь создать экземпляр субактора.

    PS Интересно, что разработчики этого фреймворка не сочли необходимым облегчить выполнение этого общего требования .


    0 ответов