Scala 有没有办法扩展对象?
在scala中,我们不能扩展Scala 有没有办法扩展对象?,scala,Scala,在scala中,我们不能扩展对象: object X object Y extends X 给出错误错误:未找到:键入X 在我的例子中,有人在一个对象中定义了一些功能,我需要扩展它(基本上是添加另一个方法)。扩展此对象的最简单方法是什么 实际上不能扩展一个对象,因为这样会创建两个对象,而一个对象按定义只存在一次(编辑:嗯,这不完全正确,因为对象定义可以在类或方法中) 出于您的目的,请尝试以下方法: object X { } object Y { def a = 5 } impli
对象
:
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没有子类化关系,这就是为什么首先要子类化。我更喜欢这样做。另外,我喜欢它在代码中的组合方式。非常可读。