首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala继承参数化构造函数

Scala继承参数化构造函数
EN

Stack Overflow用户
提问于 2011-06-28 02:09:58
回答 4查看 18.7K关注 0票数 26

我有一个带有几个可选参数的抽象基类:

代码语言:javascript
复制
abstract case class Hypothesis(
    requirement: Boolean = false,
    onlyDays:   Seq[Int] = Nil,
    …
) extends Something {…}

我真的需要在顶部‽上显式地重复所有带有附加关键字override val的参数吗

代码语言:javascript
复制
case class SomeHypothesis(
    anotherArg: SomeType,
    override val requirement: Boolean = false,
    override val onlyDays:   Seq[Int] = Nil,
    …
) extends Hypothesis(
    requirement,
    onlyDays,
    …
) {…}

或者有像这样的语法

代码语言:javascript
复制
case class SomeHypothesis(anotherArg: SomeType, **) extends Hypothesis(**) {…}

我甚至不需要anotherArg,只需要一种将所有关键字参数传递给超级构造函数的方法。

我真的很喜欢Scala关于构造函数的想法,但如果没有对应的语法,我会很失望:(

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-28 02:22:55

您可以只在继承的类中使用虚拟名称:

代码语言:javascript
复制
case class SomeHypothesis(anotherArg: SomeType, rq: Boolean = false, odays: Seq[Int] = Nil)
extends Hypothesis(rq, odays)

但您确实需要重复默认值。不需要覆盖val

编辑:

请注意,您的抽象类不应该是case类。扩展case类现在是deprecated。您应该为您的抽象类使用extractor

代码语言:javascript
复制
abstract class SomeHypothesis(val request: Boolean)

object SomeHypothesis {
  def unapply(o: Any): Option[Boolean] = o match {
    case sh: SomeHypothesis => Some(sh.request)
    case _ => None
  }
}
票数 12
EN

Stack Overflow用户

发布于 2011-06-28 03:25:54

在我看来,默认值的策略不属于基类,而应该放在具体的类中。相反,我会执行以下操作:

代码语言:javascript
复制
trait Hypothesis {
  def requirement: Boolean
  def onlyDays: Seq[Int]
  /* other common attributes as necessary */
}

case class SomeHypothesis(anotherArg: SomeType,
                          requirement: Boolean = false,
                          onlyDays: Seq[Int] = Nil)
  extends Hypothesis

SomeHypothesis的case类字段将满足假设特征的要求。

正如其他人所说,您仍然可以使用提取器对常见部分进行模式匹配:

代码语言:javascript
复制
object Hypothesis {
  def unapply(h: Hypothesis): (Boolean, Seq[Int]) = (h.requirement, h.onlyDays)
}
票数 5
EN

Stack Overflow用户

发布于 2015-02-12 07:50:09

我已经花了几天的时间在办公桌上敲打我的头,试图理解为什么命名的params不会进入扩展课程。

我尝试了特征,copy(),你能想到的--我和编译器总是不一致,当事情确实编译的时候,值永远不会被传递。

所以要清楚的是如果你有课程

代码语言:javascript
复制
class A(someInt:Int = 0, someString: String ="xyz", someOtherString: String = "zyx")  

你想要扩展它:

代码语言:javascript
复制
class B extends A // does NOT compile 

class B(someInt: Int, someString: String, someOtherString: String) extends A // compiles but does not work as expected 

您可能认为对B的调用如下所示:

代码语言:javascript
复制
case object X = B(someInt=4, someString="Boo", someOtherString="Who") 

实际上要么不编译(遗憾的是它编译了),要么实际工作了(它不编译)

相反,你需要创建B,如下所示(是的,这是上面答案的重复,但当google引导我到这里时,它一开始并不明显……)

代码语言:javascript
复制
class B(someInt: Int, someString: String, someOtherString: String) extends A(someInt, someString, someOtherString) 

而现在

代码语言:javascript
复制
case object X = B(someInt=4, someString="Boo", someOtherString="Who") 

同时进行编译和工作

我还没有计算出可以在B类构造函数中放置默认值的内容/时间和位置的所有组合和排列,但我非常确定可以在B类的定义中指定具有“预期”结果的默认值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6497059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档