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

Scala - How to save Trait's names in a collection?

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

这是我可以用 类 做的事情,使用动态 class 加载按名称实例化它们。

我的编辑:

例如:我有这个

val order =  new Order with Bonus with Discount

with 'a tool' - 我正在考虑 have/create 一些可以帮助用户只进行正确混合的东西。我的意思是 "the right mixing"?如果有人这样做混合:

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

所以,我的想法是构建一些东西并控制这些混合,以某种方式定义这些规则。在我看来,混合不能 force/oblige 第三方知道 Trait 中编码的内容,以便知道何时何地可以混合它。

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

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@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@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 的 class 也必须实现 Bonus

排序有点复杂。 abstract override修饰符旨在促进stackable traits的实现,但它有一个"side effect",可以在这里被利用:一个特征,它有一个用abstract override注释的方法只能混合在 after 特征或 class 中,它定义了该方法的具体实现。