Scala - 如何在集合中保存特征的名称?

时间:2015-01-13 10:55:30

标签: scala traits

我正在尝试构建一些东西来控制Traits的混合。例如,如何保存集合中的Trait个名称,例如MapList String个值?

我可以使用Classes进行操作,使用动态类加载通过名称对它们进行实例化。

我的编辑:

例如:我有这个

val order =  new Order with Bonus with Discount

使用'工具' - 我正在考虑/创造一些能帮助用户做正确混合的东西。我的意思"正确的混合"?如果有人这样混合:

val order =  new Order with Bonus with Discount with Bonus 
//should be wrong, based on my rules

依此类推......,我需要举例说Discount不能在Bonus之前混合:

val order =  new Order with Discount with Bonus //wrong, based on my rules

我需要说an order不能没有Bonus,例如:

val order =  new Order with Discount //wrong

但可以没有Discount,例如:

val order =  new Order with Bonus //right

所以,我的想法是建立一些东西并控制这些混合,以某种方式定义这些规则。根据我的意见,混合不能强迫/强迫第三方知道在Trait中编码的内容,以便知道何时何地混合它。

1 个答案:

答案 0 :(得分:1)

您可以让编译器为您强制执行这些规则。考虑一下:

trait Base { def kind: String }
trait Bonus extends Base { override def kind = "bonus" }
trait Discount extends Base { abstract override def kind = "discount" }
trait Order { self: Bonus => }

new Order with Bonus
res0: Order with Bonus = $anon$1@19b4e418 

new Order with Discount
<console>:12: error: illegal inheritance;
self-type Order with Discount does not conform to Order's selftype Order with Bonus     

new Order with Bonus with Discount
res2: Order with Bonus with Discount = $anon$1@13dbf6de

new Order with Discount with Bonus
<console>:12: error: overriding method kind in trait Discount of type => String;
method kind in trait Bonus of type => String needs `abstract override' modifiers
          new Order with Discount with Bonus

这里有两件事: trait Order { self: Bonus => }表示实现Order的任何类都必须实现Bonus

排序有点复杂。 abstract override修饰符旨在促进stackable traits的实现,但它具有“副作用”,可以在此处使用:具有abstract override注释方法的特征只能是在之后混合特征或定义该方法的具体实现的类。