我正在尝试构建一些东西来控制Traits
的混合。例如,如何保存集合中的Trait
个名称,例如Map
或List
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中编码的内容,以便知道何时何地混合它。
答案 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
注释方法的特征只能是在之后混合特征或定义该方法的具体实现的类。