Рассмотрение конструктора как функции в Scala - как разместить конструкторы на карте?

Мне нужно проанализировать некоторые сообщения. Первые 4 байта сообщения идентифицируют тип сообщения, поэтому, используя это, я могу создать экземпляр объекта правильного типа. Чтобы сделать эту операцию эффективной, я подумал, что создам хэш-карту, где ключ - это первые 4 байта, а значение - конструктор объекта. Я могу просто найти конструктор и вызвать его.

В конце концов, конструкторы - это просто функции, и не должно возникнуть проблем с размещением функций на карте. Оказывается, у меня возникают некоторые трудности с этим, потому что я не знаю, как правильно выразить ссылку на конструктор.

Чтобы конкретизировать упрощенный пример, предположим, что у нас есть базовый класс сообщения, MsgBase и пара подклассов, MsgA и MsgB . Если я создаю сопутствующий объект для каждого сообщения и помещаю в него фабричную функцию, я могу без проблем создать массив, используя эти функции.

Вот упрощенный пример, который принимает сообщение в виде строки.

class MsgBase(message: String) { }

class MsgA(message: String) extends MsgBase(message) { }

object MsgA  { def makeIt(message: String): MsgA = new MsgA(message)  }

и где MsgB аналогичен. Затем я могу создать карту:

val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)

val myMsg = cm("a")("a.This is the message")

Похоже, я должен иметь возможность ссылаться на конструктор объекта сообщения непосредственно в выражении, строящем карту, вместо использования тривиальной функции в сопутствующем объекте, но я не понял любым способом выразить это. Есть ли способ?

10
задан mauris 29 May 2011 в 06:48
поделиться