在scala中,我们无法扩展object:
object X
object Y extends X
Run Code Online (Sandbox Code Playgroud)
给出错误 error: not found: type X
在我的情况下,有人在对象中定义了一些功能,我需要扩展它(基本上添加另一个方法).扩展此对象的最简单方法是什么?
Jen*_*der 80
通常,正确的答案取决于实际的业务需求.从某个对象延伸会在某种意义上违背该对象的目的,因为它不再是单例.
可能的解决方案是将行为提取为抽象特征.并创建扩展该特征的对象,如下所示:
trait T{
// some behavior goes here
}
object X extends T
object Y extends T {
// additional stuff here
}
Run Code Online (Sandbox Code Playgroud)
YoK*_*YoK 34
如果要使用其他对象的方法和值,可以使用import.
object X{
def x = 5
}
object Y{
import X._
val y = x
}
Run Code Online (Sandbox Code Playgroud)
Owe*_*wen 12
你实际上不能扩展一个对象,因为它会创建两个对象,并且一个对象按定义只存在一次(编辑:嗯,这不完全正确,因为对象定义可以在类或方法中).
为了您的目的,试试这个:
object X {
}
object Y {
def a = 5
}
implicit def xToY(x: X.type) = Y
println(X.a)
Run Code Online (Sandbox Code Playgroud)
它实际上并没有扩展,但它允许您在其上调用新方法,而不是最初定义的方法.
在两个对象之间共享代码的唯一方法是使用一个或多个公共超类/特征.
请注意,从 开始,您可以通过导出子句Scala 3使用组合(而不是继承),该子句允许为对象的选定成员定义别名:
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
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以限制要导出的成员:
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
Run Code Online (Sandbox Code Playgroud)