Scala Trait实现必须实现两种方法之一

Scala Trait实现必须实现两种方法之一,scala,inheritance,Scala,Inheritance,假设我有这样一个特点: trait Truthy { def isFalse = !isTrue def isTrue = !isFalse } 显然,如果扩展trait的类没有实现isTrue或isFalse,并且其中一个被调用,那么这将无限递归 我可以在没有默认实现的情况下保留isTrue或isFalse,但是我必须选择,有些实现可能具有非常自然的isTrue实现,而其他实现可能具有自然的isFalse实现 有没有一种方法可以强制扩展类实现这两种方法中的一种而不支持其中一种方法

假设我有这样一个特点:

trait Truthy {
   def isFalse = !isTrue
   def isTrue = !isFalse
}
显然,如果扩展trait的类没有实现
isTrue
isFalse
,并且其中一个被调用,那么这将无限递归

我可以在没有默认实现的情况下保留
isTrue
isFalse
,但是我必须选择,有些实现可能具有非常自然的
isTrue
实现,而其他实现可能具有自然的
isFalse
实现


有没有一种方法可以强制扩展类实现这两种方法中的一种而不支持其中一种方法?

在Scala中没有办法强制执行这样的约束,但是可以使用多个trait来解决这个问题;e、 g:

trait Truthy {
  def isFalse: Boolean
  def isTrue: Boolean
}

object Truthy {
  trait DeriveIsFalse {
    this: Truthy =>

    def isFalse = !isTrue
  }

  trait DeriveIsTrue {
    this: Truthy =>

    def isTrue = !isFalse
  }
}
然后您可以将其用作:

class MyImplementation extends Truthy with Truthy.DeriveIsTrue {
  def isFalse = someMeaningfulImplementation()
}

这是一种方法,但如果使用多个特征,肯定还有其他方法。

我想问题是简化,因为简单的方法是
final def isFalse=!isTrue
在行不通的序列中,因为它不允许在子类中提供
isFalse
的实现。