Scala - 如何将特征的名称保存在集合中?
Scala - How to save Trait's names in a collection?
我正在尝试构建一些东西来控制 Traits
的混合。例如,如何将 Trait
的名称保存在集合中,比如在 Map
或 List
中作为 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 中,它定义了该方法的具体实现。
我正在尝试构建一些东西来控制 Traits
的混合。例如,如何将 Trait
的名称保存在集合中,比如在 Map
或 List
中作为 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 中,它定义了该方法的具体实现。