Есть ли способ продлить объект? - PullRequest
54 голосов
/ 02 октября 2011

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

object X 
object Y extends X

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

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

Ответы [ 6 ]

78 голосов
/ 02 октября 2011

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

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

trait T{
    // some behavior goes here
}

object X extends T

object Y extends T {
    // additional stuff here
}
33 голосов
/ 02 декабря 2013

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

object X{
  def x = 5
}

object Y{
  import X._
  val y = x
}
10 голосов
/ 02 октября 2011

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

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

object X {
}

object Y {
    def a = 5
}

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

println(X.a)

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

6 голосов
/ 02 октября 2011

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

2 голосов
/ 02 апреля 2014

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

в Parent.scala

class Parent {}

object Parent extends Parent {}

А потом в Child.scala

object Child extends Parent {}

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

0 голосов
/ 21 мая 2019

Обратите внимание, что с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...