首页 > 解决方案 > Scala:扩展包含“应用”方法的基类

问题描述

我在“通用”模块中有一个基类,如下所示:

class BaseClass(args: Seq[String] = Seq()) extends Serializable {
  private val argMap: Map[String, String] = 

 // <More code here...>

object BaseClass {
 def apply(args: Seq[String] = Seq()): BaseClass = new BaseClass(args)
}

现在我想在我的“模块”中扩展这个 BaseClass,所以我正在尝试这个......

class MyNewClass(args: Seq[String] = Seq()) extends com.xyz.BaseClass {
   // Add additional code here
}
object MyNewClass extends com.xyz.BaseClass {
  def apply(args: Seq[String] = Seq()): MyNewClass = new com.xyz.MyNewClass(args)
}

我的理解是,当我实例化 MyNewClass 时,它会自动实例化并调用基类的“应用”方法,但这并没有发生。什么是扩展 BaseClass 使其所有变量和方法都可以通过 Child 类访问的正确方法?

标签: scala

解决方案


我的理解是,当我实例化 MyNewClass 时,它会自动实例化并调用基类的“应用”方法......

你的理解不太对。

extends com.xyz.BaseClass意味着这个类继承自基类class,而不是单例类object

new com.xyz.MyNewClass(args)创建指定类的新实例,绕过apply()任何伴随对象中的方法。

什么是扩展 BaseClass 使其所有变量和方法都可以通过 Child 类访问的正确方法?

当前的代码正是这样做的。MyNewClass及其伴生对象从 继承所有成员BaseClass。没有任何东西是从BaseClass伴随对象继承的,因为你不能扩展object,并且你没有继承访问权限,BasseClass所以虽然实例可以访问伴随对象的BaseClass私有成员,但实例不能。BaseClassMyNewClass


推荐阅读