【发布时间】:2018-06-02 20:27:18
【问题描述】:
在 scala 中定义案例类的类型层次结构时:
sealed trait FooBar {
def A:Int
def B:Int
def C:Int
}
// works
final case class Bar(A:Int, B:Int, C:Int)extends FooBar
// fails
final case class Bar extends FooBar(A:Int, B:Int, C:Int)
// fails
final case class Foo extends FooBar
在定义继承类型时如何避免指定已经继承的参数?这是否可能没有任何宏:Scala case classes and constructors
抽象类是否更适合此目的?
【问题讨论】:
-
小心,您的示例无法编译。密封特征声明中的
,不是合法的 scala。 -
抱歉 - 修复了示例。
-
在您的任何情况下都没有“已经继承的参数”,因为
FooBar没有参数(并且特征永远不会有它们);它有 3 种方法,可以作为参数或任何其他方式实现。 -
如果没有宏可能有人会建议它作为您所链接问题的答案。
-
我认为问题出在这样一个事实,即您必须为
Bar类的构造函数声明签名,并且类型名称后面的括号是您在 Scala 中这样做的位置(对于“主要”构造函数)。对于案例类,它也被重新用作字段声明的来源,但这是次要的。请注意,与方法不同,构造函数不会自动继承。除非您使用某些工具(如宏)为您生成构造函数 - 您无法避免将其签名显式放置到指定位置的需要。
标签: scala inheritance abstract-class traits case-class