在Scala中有一种方法可以从Case类的实例中引用Companion对象吗?

Tec*_*mag 6 inheritance scala

在我的具体情况下,我有一个(不断增长的)具有基本特征的案例类库(TKModel)

然后我有一个抽象的class(TKModelFactory[T <: TKModel]),它由所有伴随对象扩展.

所以我的伴侣对象本身都知道他们需要提供的"答案"的类型('T')以及他们通常"接受"常用实现方法的对象类型.(如果我变得懒惰,剪切并粘贴代码块来搜索并销毁这个节省了我的培根!)我确实在互联网上看到了警告,但是任何形式CompanionObject.method(caseClassInstance: CaseClass)都充斥着"代码味".不确定他们是否真的适用于Scala?

但是,似乎没有任何方法可以在抽象case class(TKModel)中声明任何可以引用(在运行时)case类的特定实例的正确伴随对象的东西.这导致我必须编写(和编辑)一些我希望在每个案例类中标准化的方法调用.

case class Track(id: Long, name: String, statusID: Long) extends TKModel

object Track extends TKModelFactory[Track]

如何将我写的东西在TKModel这样new Track(1, "x", 1).someMethod()实际上可以调用Track.objectMethod()

是的,我可以在抽象类中编写val CO = MyCompanionObject类似 implicit val CO: ???的内容TKModel,并使所有调用都挂起该值.试图找到使编译器为此感到高兴的任何咒语,但似乎是不可能的任务.因为我不能声明我不能在抽象类中的任何占位符方法中引用它.

是否有一种更优雅的方式来简单地获取对案例类伴随对象的引用?

我的具体问题,如前所述(但似乎尚未回答),是否有办法处理伴随对象和case类的继承,并找到引用,以便我可以编写常见的方法调用抽象类?

还是有一个完全不同的更好的模型?

Dav*_*ook 2

伴生对象无权访问实例,但案例类没有理由不能具有调用伴生对象的方法。

case class Data(value: Int) {
  def add(data: Data) = Data.add(this,data)
}

object Data {
  def add(d1: Data, d2: Data): Data =  Data(d1.value + d2.value)
}
Run Code Online (Sandbox Code Playgroud)

  • True - 但是您必须显式命名对伴生对象的调用。我想做的是在父级(基类“TKModel”)中编写一些内容,该内容由未来“TKModel”的所有实例继承,并调用所有未来“TKModelFactory”伴随对象 - 而且我没有对它们的引用,也不是为该调用抽象引用它们(据我所知)的方法。 (5认同)