有办法阻止两个特质混在一起吗?
我知道您可以使用自我类型注释来要求仅将特征混入特定类型的类中,但是您可以使用类似的构造来要求目标类不混入特定特征吗?
例如:
abstract class Collector(p: Boolean)
trait Cache
trait ACache extends Cache { self: Collector => }
trait BCache extends Cache { self: Collector => }
我是否可以要求将Collector
,ACache
的任何实现混入BCache
,ACache
或不具有任何缓存特征,但不能同时BCache
和class GoodCollector(p: Boolean) extends Collector(p) with ACache //legal
class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache //illegal
?
{{1}}
答案 0 :(得分:7)
如果您这样更改Cache
:
trait Cache[A <: Cache[_]]
trait ACache extends Cache[ACache] { self: Collector =>
}
trait BCache extends Cache[BCache] { self: Collector =>
}
然后:
class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache
将失败,并显示:
非法继承; BadCollector类继承了特征缓存的不同类型实例: 缓存[BCache]和缓存[ACache] 类BadCollector(p:Boolean)使用带有BCache的ACache扩展了Collector(p)