Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:是否可以覆盖默认的case类构造函数?_Scala_Scala 2.8 - Fatal编程技术网

Scala:是否可以覆盖默认的case类构造函数?

Scala:是否可以覆盖默认的case类构造函数?,scala,scala-2.8,Scala,Scala 2.8,只是想知道这是否可能。 我实际上想做的是在将其中一个参数存储为val之前检查并可能修改它 或者,我可以使用重载并将默认构造函数设为私有。在这种情况下,我还希望将private作为伴随对象中的默认工厂构造函数,我将如何做到这一点 非常感谢 亚当 编辑:我发现使默认构造函数私有也会使默认工厂构造函数私有,所以我有一个解决方案,我仍然想知道默认构造函数是否可以重写,尽管你可以重载构造函数。它与C++或java一样。只需创建另一个构造函数 class Foo( _input:Int ){ def

只是想知道这是否可能。 我实际上想做的是在将其中一个参数存储为val之前检查并可能修改它

或者,我可以使用重载并将默认构造函数设为私有。在这种情况下,我还希望将private作为伴随对象中的默认工厂构造函数,我将如何做到这一点

非常感谢

亚当


编辑:我发现使默认构造函数私有也会使默认工厂构造函数私有,所以我有一个解决方案,我仍然想知道默认构造函数是否可以重写,尽管你可以重载构造函数。它与C++或java一样。只需创建另一个构造函数

class Foo( _input:Int ){
    def this() = this( 0 )
}

或者您也可以看到这样的帖子。

辅助案例类构造函数的存在不会导致编译器在类的同伴中生成额外的工厂方法,因此您将无法方便地使用
CaseClaseName(«辅助构造函数参数列表»)
创建它们。您必须使用
new
关键字


最好将您在备用工厂方法中描述的逻辑类型放在伴生对象中,并坚持使用主构造函数。

您可以通过编写自己的
apply
(对于工厂)和
unapply
(对于模式匹配)将常规类转换为伪case类方法在伴随对象中。或者,您可以简单地在case类的伴生对象中编写一个命名工厂方法。

您没有更改默认构造函数存储其参数的方式的选项(例如,在将参数存储为
val
s之前修改参数),但是如果参数错误,您可以选择引发异常(这将在存储参数后发生)

class Foo( _input:Int ){
    def this() = this( 0 )
}
但这些并没有得到工厂的方法

通过将工厂方法添加到伴随对象中,您可以轻松地自己创建工厂方法

object Foo{
     def apply(x:Int,y:Int) = new Foo(x,y)
}

除此之外,您还必须放弃case类,自己实现它的各个部分:
apply
unapply
equals
hashCode
。Scala中的编程讨论了如何实现所有这些,为
equals
hashCode
给出了很好的公式,为什么你想这样做吗?case类用于定义代数数据类型,因此添加的构造函数会稍微改变调用方的参数。就验证参数而言,可以在主构造函数中使用
assert
require
@adam77将初始语句重新定义为问题,“我是否可以检查并可能修改[案例类参数]?”答案是肯定的。我刚刚在这里发布了一个相关问题的详细信息:谢谢,但问题是重写而不是重载。没有构造函数可以被重写,因为它们从一开始就不是继承的。在将参数存储在case类中之前,可以安全地更改参数。而且您仍然可以做很多更复杂的事情在不放弃案例类的所有好处的情况下。我刚刚在另一个线程上详细介绍了我的解决方案:
object Foo{
     def apply(x:Int,y:Int) = new Foo(x,y)
}