scala Case类伴随对象的部分特征实现

sbtkgmzw  于 2023-05-17  发布在  Scala
关注(0)|答案(2)|浏览(189)

我有一个trait描述了两个方法:一个是“静态的”,一个不是。我想要一个case类来像这样扩展trait

trait SomeTrait {
  def nonStaticMethod(): Int
  def staticMethod(): String
}

case class SomeTraitImplementor(a: Int) extends SomeTrait {
  def nonStaticMethod(): Int = {
    a + 1
  }
}

object SomeTraitImplementor {
  def staticMethod(): String = "static response"
}

这样的事情可能吗?
谢谢!

ldioqlga

ldioqlga1#

只需将implementation作为默认值放入trait本身:

trait SomeTrait {
  def nonStaticMethod(): Int
  def staticMethod(): String = SomeTraitImplementor.staticMethod()
}
snz8szmq

snz8szmq2#

简短的回答是你不能这么做。听起来像是在尝试在Scala中应用Java风格。Scala有Singleton Objects,它只是一个单例类。你可以有一个Singleton而不需要类。拥有一个与类同名的Singleton对象被称为Companion Object,这是Java中最接近静态方法的东西。
你不需要像这样定义一个类然后在里面定义静态方法

class Calculator {
  public static int sum(int a, int b) {
    return a + b;
  }
}

你可以像以前那样直接定义对象,甚至不用定义同名的类。所以,你不能在trait中定义什么是示例方法,什么是类方法。基于scala中的singleton object,它和其他类一样,只是它只有一个示例,它可以从其他类或trait继承属性和方法。因此,只在trait中定义的内容,除了在abstract class或另一个trait中之外,需要在子classsingleton object中实现。
在您提供的这段代码中,解决方案可能是将trait拆分为两个trait,并使类扩展一个trait,而单例对象扩展另一个trait。如果你想防止一个trait被另一个类或trait扩展,你可以考虑使用带有修饰符附件的内部类。
也许如果你分享你试图在领域级别解决的问题,可以建议另一种方法。

相关问题