有没有办法扩展对象?

Jus*_*s12 55 scala

在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)

  • 这就是我最终做的。由于单例要求而无法扩展对象实际上是有道理的。 (2认同)

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)

它实际上并没有扩展,但它允许您在其上调用新方法,而不是最初定义的方法.

  • IMO,这是邪恶的,从不使用这样的隐式转换,或者你要求麻烦. (11认同)

Mir*_*tta 6

在两个对象之间共享代码的唯一方法是使用一个或多个公共超类/特征.

  • 不,该更改允许超类的对象成员被子类中的对象成员覆盖.`A类{对象a}; B类扩展A {覆盖对象a}; ((新B):A).a //访问Ba` (2认同)

Xav*_*hot 5

请注意,从 开始,您可以通过导出子句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)