в Scala: общая черта с сопутствующей чертой объекта? - PullRequest
2 голосов
/ 09 мая 2019

Учитывая это:

trait TraitClass[A <: TraitObject] {
   def name = A.getName // <-- How ???
}

trait TraitObject[A <: TraitClass] {
   def apply: A
   def getName: String
}

case class Foo(a: Int) extends TraitClass[Foo] {

}

object Foo extends TraitObject[Foo] {
   def getName = "foo"
   def apply = Foo(12)
}

Есть ли способ заставить эту работу работать более Scala?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Я нашел решение:

abstract class TraitClass(obj: TraitObject[_]) {
   def name = obj.getName
}

trait TraitObject[A <: TraitClass] {
   def apply: A
   def getName: String
}

case class Foo(a: Int) extends TraitClass(Foo) {

}

object Foo extends TraitObject[Foo] {
   def getName = "foo"
   def apply = Foo(12)
}

Передача Companion Object в качестве входных данных свойства класса позволяет вам использовать его.

Рабочий пример: https://scastie.scala -lang.org / D2GrOHIiQM6KcUMAYHjuuw

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

Это очень сильно зависит от вашего варианта использования. Например

  trait TraitClass[A <: TraitObject[_]] {
    def getA: A
    def name: String = getA.getName
  }

  trait TraitObject[A <: TraitClass[_]] {
    def apply: A
    def getName: String
  }

  case class Foo(a: Int) extends TraitClass[Foo.type] {
    def getA = Foo
  }

  object Foo extends TraitObject[Foo] {
    def getName = "foo"
    def apply = Foo(12)
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...