是否可以在抽象类中混合特征,但是它是否特定于Scala中的每个子类?

时间:2017-11-09 11:09:59

标签: scala abstract-class traits

我在Scala中为Logic Expressions编写了一些代码,我想知道我是否能找到一种方法将特性混合到一个抽象类中,所以我不必在每个子类中扩展它。这就是我所拥有的:

abstract class LogicExpression

case class Literal(lit:String, not:Boolean) extends LogicExpression with Ordered[Literal]
case class Conjunction(lits:Seq[Literal]) extends LogicExpression with Ordered[Conjunction]
...

我希望每个case类只能与另一个自身的实例相比较(Literal with Literal,Conjunction只与Conjunction等)但是我想在抽象类中扩展这个特性所以我不必在每个子类上重复它。这可能吗?

我试过

abstract class LogicExpression extends Ordered[LogicFormula]

但这样也可以比较Literal和Conjunction。

1 个答案:

答案 0 :(得分:4)

你需要这样的东西:

sealed trait LogicExpression[T <: LogicExpression[T]] extends Ordered[T]

case class SomeExpression() extends LogicExpression[SomeExpression] {
  override def compare(that: SomeExpression) = ???
}