Подтвердить что ты не робот

Есть ли способ расширить объект?

В scala мы не можем расширить object:

object X 
object Y extends X

дает ошибку error: not found: type X

В моем случае кто-то определил некоторые функции в объекте, и мне нужно его расширить (в основном добавить другой метод). Каким будет самый простой способ расширить этот объект?

4b9b3361

Ответ 1

Как часто правильный ответ зависит от фактического бизнес-требования. Продвижение от объекта в некотором смысле будет игнорировать цель этого объекта, поскольку оно больше не будет синглом.

Что может быть решением, так это вывести поведение в абстрактный признак. И создайте объекты, расширяющие эту черту так:

trait T{
    // some behavior goes here
}

object X extends T

object Y extends T {
    // additional stuff here
}

Ответ 2

Если вы хотите использовать методы и значения из другого объекта, вы можете использовать импорт.

object X{
  def x = 5
}

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

Ответ 3

Вы не можете фактически расширить объект, потому что это создало бы два из них, а объект по определению существует только один раз (редактирование: ну, это не совсем так, потому что определение объекта может быть в классе или методе).

В ваших целях попробуйте следующее:

object X {
}

object Y {
    def a = 5
}

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

println(X.a)

На самом деле это не распространяется, но это позволяет вам вызывать на нем новые методы, чем они были изначально определены.

Ответ 4

Единственный способ совместного использования кода между двумя объектами - это наличие одного или нескольких общих суперклассов/признаков.

Ответ 5

Вы можете преобразовать родительский объект в класс + сопутствующий объект, а затем иметь дочерний класс расширения, например.

в Parent.scala

class Parent {}

object Parent extends Parent {}

И затем в Child.scala

object Child extends Parent {}

Да, это скорее взлом, чем решение.

Ответ 6

Обратите внимание, что с Dotty (основа 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