正确使用 Scala 特征和案例对象



试图掌握Scala类和特征的窍门,这里有一个简单的例子。我想定义一个类,它指定了各种操作,可以通过多种方式实现。我可能会从,

sealed trait Operations{
  def add
  def multiply
}

例如,我可能会用一个对象实例化这个类,add并且非常明智地multiply

case object CorrectOperations extends Operations{
    def add(a:Double,b:Double)= a+b
    def multiply(a:Double,b:Double)= a*b
}

而且,可能还有其他方法来定义这些操作,例如这种明显错误的方式,

case object SillyOperations extends Operations{
    def add(a:Double,b:Double)= a + b - 10
    def multiply(a:Double,b:Double)= a/b
}

我想将这样的实例传递到一个将以特定方式执行操作的函数中。

 def doOperations(a:Double,b:Double, op:operations) = {
   op.multiply(a,b) - op.add(a,b)
 }

我想doOperations拿任何operations类型的对象,以便我可以使用addmultiply,无论它们是什么。

我需要改变什么doOperations,我在这里误解了什么?谢谢

尚未运行您的代码,但我想您遇到了编译错误。

如果未在Operations特征中定义方法的签名,则默认情况下,它将被解释为 () => Unit

这意味着继承对象中的方法并没有真正覆盖特征中的方法,而是定义重载。在此处查看更多相关信息。您可以通过在对象方法中的方法定义前面编写override来验证这一点。这将迫使编译器明确警告您,这些方法不会覆盖祖先特征中的任何内容,并作为防止类似错误的"安全网"。

要修复该错误,请拼写出特征的签名,如下所示:

sealed trait Operations{
  def add(a:Double,b:Double):Double
  def multiply(a:Double,b:Double):Double
}

实际上,在继承对象的方法中甚至不需要输出参数类型(但请注意添加的override属性):

case object CorrectOperations extends Operations{
    override def add(a:Double,b:Double) = a+b
    override def multiply(a:Double,b:Double) = a*b
}

最新更新