在scala中,我们不能扩展object:
object
object X object Y extends X
给出错误error: not found: type X在我的例子中,有人在一个对象中定义了一些功能,我需要扩展它(基本上是添加另一个方法)。扩展这个对象最简单的方法是什么?
error: not found: type X
enyaitl31#
正确的答案往往取决于实际的业务需求。从一个对象扩展在某种意义上违背了该对象的目的,因为它不再是一个单一的对象。一个可能的解决方案是将行为提取到一个抽象的特征中,然后创建扩展该特征的对象,如下所示:
trait T{ // some behavior goes here } object X extends T object Y extends T { // additional stuff here }
r8xiu3jd2#
如果要使用另一个对象方法和值,可以使用import
object X{ def x = 5 } object Y{ import X._ val y = x }
ki0zmccv3#
您实际上不能扩展一个对象,因为这样会创建两个对象,而一个对象根据定义只能存在一次(编辑:但这并不完全正确,因为对象定义可以在类或方法中)。出于您的目的,请尝试以下操作:
object X { } object Y { def a = 5 } implicit def xToY(x: X.type) = Y println(X.a)
它实际上并不扩展,但它允许您在其上调用比最初定义的方法更新的方法。
toiithl64#
在两个对象之间共享代码的唯一方法是拥有一个或多个公共超类/特征。
pepwfjgg5#
请注意,从Scala 3开始,您也可以通过export clauses使用组合(而不是继承),export clauses允许为对象的选定成员定义别名:
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
djmepvbi6#
您可以将父对象转换为类+伴随对象,然后让子对象扩展类。在父级. scala中
class Parent {} object Parent extends Parent {}
然后在Child. scala中
object Child extends Parent {}
是的,这与其说是解决方案,不如说是一种黑客行为。
t2a7ltrp7#
这是一个欧文的Scala 3的答案:可以使用扩展来扩展伴随对象。
object X: def a = 5 end X // Somewhere else, another file where X is visible extension (x: X.type) def b = 42 end extension // Somewhere else, another file where // both X and the extension are visible @main def main = println(X.a) println(X.b)
7条答案
按热度按时间enyaitl31#
正确的答案往往取决于实际的业务需求。从一个对象扩展在某种意义上违背了该对象的目的,因为它不再是一个单一的对象。
一个可能的解决方案是将行为提取到一个抽象的特征中,然后创建扩展该特征的对象,如下所示:
r8xiu3jd2#
如果要使用另一个对象方法和值,可以使用import
ki0zmccv3#
您实际上不能扩展一个对象,因为这样会创建两个对象,而一个对象根据定义只能存在一次(编辑:但这并不完全正确,因为对象定义可以在类或方法中)。
出于您的目的,请尝试以下操作:
它实际上并不扩展,但它允许您在其上调用比最初定义的方法更新的方法。
toiithl64#
在两个对象之间共享代码的唯一方法是拥有一个或多个公共超类/特征。
pepwfjgg5#
请注意,从
Scala 3
开始,您也可以通过export clauses使用组合(而不是继承),export clauses允许为对象的选定成员定义别名:请注意,您还可以限制要导出的成员:
djmepvbi6#
您可以将父对象转换为类+伴随对象,然后让子对象扩展类。
在父级. scala中
然后在Child. scala中
是的,这与其说是解决方案,不如说是一种黑客行为。
t2a7ltrp7#
这是一个欧文的Scala 3的答案:可以使用扩展来扩展伴随对象。