gpt4 book ai didi

scala - 在 Scala 中,有没有办法从案例类的实例中引用伴侣对象?

转载 作者:行者123 更新时间:2023-12-04 15:56:46 24 4
gpt4 key购买 nike

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

然后我有一个抽象类( TKModelFactory[T <: TKModel] ),它被所有伴随对象扩展。

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

然而,似乎没有任何方法可以在抽象案例类 ( TKModel ) 中声明任何会引用(在运行时)案例类特定实例的适当伴随对象的任何内容。这导致我不得不编写(和编辑)一些我希望在每个案例类中成为标准的方法调用。
case class Track(id: Long, name: String, statusID: Long) extends TKModelobject Track extends TKModelFactory[Track]
我如何在 TKModel 中写一些东西这样new Track(1, "x", 1).someMethod()实际上可以调用Track.objectMethod()
是的,我可以写 val CO = MyCompanionObject以及像 implicit val CO: ??? 这样的东西在 TKModel抽象类并使所有调用挂起该值。然而,试图找到任何让编译器对此感到高兴的咒语似乎是不可能完成的任务。而且由于我不能声明我不能在抽象类的任何占位符方法中引用它。

有没有更优雅的方法来简单地获取对案例类伴随对象的引用?

我的具体问题,如上所述(但似乎还没有回答),有没有办法处理伴生对象和案例类的继承并找到引用,以便我可以编写常用方法调用抽象类?

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

最佳答案

如果您更改 TKModel有点,你可以做

abstract class TKModel[T <: TKModel] {
...
def companion: TKModelFactory[T]
def someMethod() = companion.objectMethod()
}

case class Track(id: Long, name: String, statusID: Long) extends TKModel[Track] {
def companion = Track
}
object Track extends TKModelFactory[Track] {
def objectMethod() = ...
}

这样你就需要实现 companion在每个类(class)。您可以通过实现 companion 来避免这种情况。使用反射,例如(未经测试)
lazy val companion: TKModelFactory[T] = {
Class.forName(getClass.getName + "$").getField("MODULE$").
get(null).asInstanceOf[TKModelFactory[T]]
}
val是为了避免重复的反射调用。

关于scala - 在 Scala 中,有没有办法从案例类的实例中引用伴侣对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com