2012-02-02 2 views
3

Я хочу построить некоторые классы scala для моделирования RDF. У меня есть классы и свойства. Свойства смешаны с классами и могут использовать hashmap 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 

ответ

8
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 = [email protected] 

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

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

res0.properties get "a" 

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

+0

Спасибо, не знали о 'типа Dynamic'. Если я смогу использовать его для своей проблемы, я закрою этот вопрос. – roelio

+0

Я попытался использовать ваше последнее предложение, но потом столкнулся с проблемой типа, см. Мой другой вопрос: http://stackoverflow.com/q/9105791/730277 – roelio

+0

Я просто хотел не объявлять 'trait's вообще - вместо того, чтобы смешивать метод 'getProperty1', просто возьмите значение с вашей карты напрямую –

Смежные вопросы