Использование множества миксинов с самостоятельным типом - PullRequest
3 голосов
/ 02 февраля 2012

Я хочу построить несколько классов Scala для моделирования RDF. У меня есть классы и свойства. Свойства смешиваются с классами и могут использовать хэш-карту properties из-за своего собственного типа.

Поскольку у классов появляется больше свойств, мне приходится использовать множество миксинов (более 50), и мне интересно, насколько это хорошее решение для производительности?

trait Property

trait Properties {
  val properties = 
    new scala.collection.mutable.HashMap[String, Property]
}

abstract class AbstractClass extends Properties

trait Property1 {
  this: AbstractClass =>
    def getProperty1 = properties.get("property1")
}

trait Property100 {
  this: AbstractClass =>
    def getProperty100 = properties.get("property100")
}

class Class1 extends AbstractClass
    with Property1 with Property100

1 Ответ

8 голосов
/ 02 февраля 2012
scala> trait PropertyN { self: Dynamic =>
   | def props: Map[String, String]
   | def applyDynamic(meth: String)(args: Any*) = props get meth
   | }
defined trait PropertyN

Тогда вы можете создать свой класс следующим образом:

scala> class MyClass(val props: Map[String, String]) extends PropertyN with Dynamic
defined class MyClass

У вашего класса теперь есть методы, которые вы хотите:

scala> new MyClass(Map("a" -> "Hello", "b" -> "World"))
res0: MyClass = MyClass@367013

scala> res0.a
dynatype: $line3.$read.$iw.$iw.res0.applyDynamic("a")()
res1: Option[String] = Some(Hello)

Это, конечно, не очень безопасно, но и не ваше. Честно говоря, я думаю, что вам лучше использовать карту напрямую:

res0.properties get "a"

По крайней мере, вы не страдаете какой-либо иллюзией безопасности

...