特征实现必须实现两种方法之一

时间:2017-08-16 08:45:22

标签: scala inheritance

说我有这样的特质:

true

显然,如果扩展特征的类没有实现dayRender: function(date, cell) { var disabledDates = ["2017-08-17", "2017-08-23"]; if ($.inArray(date.format("YYYY-MM-DD"), disabledDates) > -1) { console.log(date.format("YYYY-MM-DD")); cell.css("background-color", "green"); } } trait Truthy { def isFalse = !isTrue def isTrue = !isFalse } 并且其中一个被调用,那么这将无限递归。

我可以在没有默认实现的情况下离开isTrueisFalse但是我必须选择并且某些实现可能具有非常自然的isTrue实现,而其他实现可能具有自然isFalse一个。

有没有办法强制扩展类实现两种方法中的一种而不偏袒其中一种?

1 个答案:

答案 0 :(得分:2)

在Scala中无法强制执行此类约束,但您可以使用多个特征来解决此问题; 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()
}

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