试图了解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
类型的任何对象,以便我可以使用add
和multiply
,无论它们是什么。
关于doOperations
我需要改变什么,以及我在这里误解了什么?感谢
答案 0 :(得分:5)
没有运行你的代码,但我认为你有编译错误。
如果您没有在Operations
特征中定义方法的签名,那么默认情况下它将被解释为() => Unit
。
这意味着继承对象中的方法实际上不是覆盖特征中的方法,而是定义重载。详细了解here。您可以通过在对象方法中的方法定义前面编写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
}