Хотя вы, возможно, захотите указать эту информацию в своем вопросе в следующий раз, я предполагаю, что вы говорите о разделе «Вкус параллелизма» , начинающемся на странице 19, точнее, заключительном абзаце на странице 27.
Полиморфная диспетчеризация, также известная как динамическая диспетчеризация, является одним из основных преимуществ объектно-ориентированного программирования (ООП). Он позволяет выбрать реализацию метода для динамического выполнения, то есть во время выполнения.
Сопоставление с образцом - это то, что вы можете сделать в функциональных языках, таких как Scala, а именно, чтобы изменить выполнение метода на основепо шаблону, которому следует один или несколько его аргументов (что-то вроде оператора case с наддувом, если метки могут быть гораздо более подробными и включать тип и другие характеристики его аргументов!).
Каркас Akka (который предлагает Scala API) используется для получения легкого параллелизма и основан на модели актера. Актеры отправляют друг другу сообщения, которые обрабатываются асинхронно, неблокирующим образом.
Теперь, когда у нас есть основы, давайте рассмотрим код, к которому относится абзац:
def receive = {
case s: Shape =>
s.draw(str => println(s"ShapesDrawingActor: $str"))
sender ! Response(s"ShapesDrawingActor: $s drawn")
case Exit =>
println(s"ShapesDrawingActor: exiting...")
sender ! Finished
case unexpected =>
val response = Response(s"ERROR: Unknown message: $unexpected"
println(s"ShapesDrawingActor: $response")
sender ! response
}
Метод приема актера в Akka вызывается каждый раз, когда он получает сообщение от другого актера. Сообщение может быть любого класса (например, String, Double или даже ваш собственный класс). Когда это происходит, сначала используется сопоставление с образцом (см. Метки регистра?) Для выполнения кода в зависимости от типа (класса) сообщения.
Если субъект получает сообщение класса Shape, первая строка после метки регистра Shape затем вызывает метод draw экземпляра Shape. Если класс сообщения во время выполнения на самом деле является подклассом Shape (он наследуется от Shape), динамическое (полиморфное) разрешение затем используется, чтобы решить, какую реализацию метода draw вызывать.
Мы могли бы достичьтот же результат, используя только один из этих двух методов, за счет необходимости писать намного больше кода без необходимости.