我有一个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"
}
这样的事情可能吗?
谢谢!
2条答案
按热度按时间ldioqlga1#
只需将implementation作为默认值放入trait本身:
snz8szmq2#
简短的回答是你不能这么做。听起来像是在尝试在Scala中应用Java风格。Scala有Singleton Objects,它只是一个单例类。你可以有一个Singleton而不需要类。拥有一个与类同名的Singleton对象被称为Companion Object,这是Java中最接近静态方法的东西。
你不需要像这样定义一个类然后在里面定义静态方法
你可以像以前那样直接定义对象,甚至不用定义同名的类。所以,你不能在trait中定义什么是示例方法,什么是类方法。基于scala中的
singleton object
,它和其他类一样,只是它只有一个示例,它可以从其他类或trait继承属性和方法。因此,只在trait中定义的内容,除了在abstract class
或另一个trait
中之外,需要在子class
或singleton object
中实现。在您提供的这段代码中,解决方案可能是将trait拆分为两个trait,并使类扩展一个trait,而单例对象扩展另一个trait。如果你想防止一个trait被另一个类或trait扩展,你可以考虑使用带有修饰符附件的内部类。
也许如果你分享你试图在领域级别解决的问题,可以建议另一种方法。