Есть ли способ расширить объект?
В scala мы не можем расширить object
:
object X
object Y extends X
дает ошибку error: not found: type X
В моем случае кто-то определил некоторые функции в объекте, и мне нужно его расширить (в основном добавить другой метод). Каким будет самый простой способ расширить этот объект?
Ответы
Ответ 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