Scala 有没有办法扩展对象?

Scala 有没有办法扩展对象?,scala,Scala,在scala中,我们不能扩展对象: object X object Y extends X 给出错误错误:未找到:键入X 在我的例子中,有人在一个对象中定义了一些功能,我需要扩展它(基本上是添加另一个方法)。扩展此对象的最简单方法是什么 实际上不能扩展一个对象,因为这样会创建两个对象,而一个对象按定义只存在一次(编辑:嗯,这不完全正确,因为对象定义可以在类或方法中) 出于您的目的,请尝试以下方法: object X { } object Y { def a = 5 } impli

在scala中,我们不能扩展
对象

object X 
object Y extends X
给出错误
错误:未找到:键入X


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

实际上不能扩展一个对象,因为这样会创建两个对象,而一个对象按定义只存在一次(编辑:嗯,这不完全正确,因为对象定义可以在类或方法中)

出于您的目的,请尝试以下方法:

object X {
}

object Y {
    def a = 5
}

implicit def xToY(x: X.type) = Y

println(X.a)

它实际上并没有扩展,但它确实允许您对其调用比最初定义的新方法。

因为正确的答案通常取决于实际的业务需求。从某种意义上说,从一个对象扩展将违背该对象的目的,因为它不再是一个单例对象

一个可能的解决方案是将行为提取成一个抽象的特征。并创建扩展该特性的对象,如下所示:

trait T{
    // some behavior goes here
}

object X extends T

object Y extends T {
    // additional stuff here
}

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

如果要使用另一个对象的方法和值,可以使用导入

object X{
  def x = 5
}

object Y{
  import X._
  val y = x
}

您可以将父对象转换为类+伴生对象,然后让子对象扩展类,例如

在Parent.scala中

class Parent {}

object Parent extends Parent {}
然后是Child.scala

object Child extends Parent {}

是的,这与其说是一种解决方案,不如说是一种黑客手段。

请注意,从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
请注意,您还可以限制要导出的成员:

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

依我看,这是邪恶的,永远不要使用这样的隐式转换,否则你就是在自找麻烦。第一句话毫无意义。@Mirco:你能解释一下吗?我也想知道为什么这是邪恶的。@Debilski@Jus12我认为问题在于,当读别人的代码并看到
X.a
时,很难找出
X.a
是什么引用,因为您需要知道范围中的隐式是什么。至少这让我很沮丧。但我想我还是建议这样做。不,这种改变允许超类的对象成员被子类中的对象成员覆盖<代码>类A{object A};类B扩展了{覆盖对象A};((新B):A.A//access B.A这就是我最后做的事。实际上,由于单例需求,无法扩展对象是有道理的。问题是X和Y没有子类化关系,这就是为什么首先要子类化。我更喜欢这样做。另外,我喜欢它在代码中的组合方式。非常可读。