在scala中,我们无法扩展object
:
object X
object Y extends X
发出错误error: not found: type X
在我的情况下,有人在对象中定义了一些功能,我需要扩展它(基本上添加另一种方法)。扩展此对象的最简单方法是什么?
答案 0 :(得分:77)
通常,正确的答案取决于实际的业务需求。从某个对象扩展在某种意义上会违背该对象的目的,因为它不再是单例。
可能的解决方案是将行为提取为抽象特征。并创建扩展该特征的对象:
trait T{
// some behavior goes here
}
object X extends T
object Y extends T {
// additional stuff here
}
答案 1 :(得分:33)
如果您想使用其他对象的方法和值,可以使用import。
object X{
def x = 5
}
object Y{
import X._
val y = x
}
答案 2 :(得分:10)
你实际上不能扩展一个对象,因为它会创建两个对象,并且一个对象按定义只存在一次(编辑:嗯,这不完全正确,因为对象定义可以在一个类或方法中)
为了您的目的,试试这个:
object X {
}
object Y {
def a = 5
}
implicit def xToY(x: X.type) = Y
println(X.a)
它实际上并没有扩展,但它确实允许你调用新方法而不是最初定义的方法。
答案 3 :(得分:6)
在两个对象之间共享代码的唯一方法是使用一个或多个公共超类/特征。
答案 4 :(得分:2)
您可以将父转换为class + companion对象,然后让子扩展类E.g。
在Parent.scala中
class Parent {}
object Parent extends Parent {}
然后在Child.scala
object Child extends Parent {}
是的,它更像是一种破解而非解决方案。
答案 5 :(得分:0)
请注意,使用Dotty
(Scala 3
的基础),您可以通过export clauses使用合成(而不是继承),它可以为对象的选定成员定义别名:>
object X { def f = 5 }
object Y {
export X._
def g = 42
def h = f * g
}
Y.f // 5
Y.g // 42
Y.h // 210
请注意,您还可以限制要导出的成员:
object X { def f = 5; def g = 6 }
object Y { export X.f }
Y.f // 5
Y.g
^^^
value g is not a member of Y