有没有办法扩展对象?

时间:2011-10-02 07:02:45

标签: scala

在scala中,我们无法扩展object

object X 
object Y extends X

发出错误error: not found: type X

在我的情况下,有人在对象中定义了一些功能,我需要扩展它(基本上添加另一种方法)。扩展此对象的最简单方法是什么?

6 个答案:

答案 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)

请注意,使用DottyScala 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