【发布时间】:2020-12-03 00:27:56
【问题描述】:
我有一个简单的特质
trait SomeTrait {
val sourceData: SourceData
}
SourceData 类具有构造函数参数p: Array[String]。
现在,当我在 Object 中扩展这个 trait 时,我们必须为 sourceData 提供实现。
object SomeObject extends SomeTrait {
override val sourceData: SourceData = ???
def main(sysArgs: Array[String]){...}
}
但是如果 SourceData 类需要 main 方法中的 sysArgs 怎么办,我如何在 main 方法中覆盖 sourceData,而不是在 SomeObject 的主体中。像这样的:
object SomeObject extends SomeTrait {
def main(sysArgs: Array[String]){
override val sourceData: SourceData = new SourceData(sysArgs)
}
}
我不想使用 var,因为 val 的不变性是首选。而且我还想拥有没有实现的特征,以强制所有子类实现 sourceData。我还有什么其他解决方案?
【问题讨论】:
-
您可以做的另一件事是将
sourceData作为Option,当调用main方法时,使用您需要的相关SourceData创建一个新的SomeObject,并使用它。根据您使用的术语,我认为这是您的主要课程的一部分。在这种情况下,您不能这样做。但是想想你可以提取到另一个类并在那里做。 -
@TomerShetah
SomeObject是顶级object,因此一旦程序运行,您就无法创建新的。 -
@Tim,您的评论已在我的文章中处理。从问题中不清楚它必须是顶级对象。如果可以将其提取到另一个对象,这种方法可能会奏效。
-
@TomerShetah 我认为它在代码中显示为顶级
object,称为SomeObject,它包含main,所以它必须存在于@987654335之前@ 被调用,并且“对象”一词在问题中,很清楚它应该是一个顶级对象。 -
@TomerShetah 如果您确实动态创建它以便它不需要是可变的,那么将值设为
Option也无济于事。
标签: scala