当前位置: 首页 > 知识库问答 >
问题:

使用私有构造函数参数扩展trait

梁烨
2023-03-14

在Scala中,如何使用trait中定义的私有构造函数参数扩展类中的trait?

trait Parent {
  protected def name: String
  require(name != "", "wooo problem!")
}

class Child(private val name: String) extends Parent {
  println("name is " + name)
}

上面的类给出了一个错误:

类子级需要是抽象的,因为方法名位于类型的trait父级中⇒ 未定义字符串。

当然-我当然可以:

  1. 使孩子类抽象,
  2. 在构造函数中定义它而不使用私有,例如class UNICEF(val name: String)
  3. 使父类成为抽象类而不是trait

但是,使用上述实现,在扩展trait时,我不可能拥有私有构造函数参数吗?注意,我希望变量是私有的,这样我就不能执行childInstance。名称。

共有2个答案

高高雅
2023-03-14

如果您在trait中有一个抽象方法,那么所有派生类都需要对抽象方法具有相同(或更宽松)的修饰符(在您的情况下至少受保护)。

trait Parent {
  protected def name: String
  require(name != "", "wooo problem!")
}

class Child(private val privateName: String) extends Parent {
  override protected def name: String = privateName
  println("name is " + name)
}

您可以将构造函数保持私有,但您需要定义覆盖受保护的def name: String并利用构造函数的私有值。

崔琦
2023-03-14

试试这个

  trait Parent {
    protected def name: String
    require(name != "", "wooo problem!")
  }

  class Child(override protected val name: String) extends Parent {
    val publicVar = "Hello World"
    println("name is " + name)
  }

  def main(args: Array[String]): Unit = {
    val child = new Child("John Doe")
    println(child.publicVar)
    println(child.name) // Does not compile
  }

您将无法访问child。名称

 类似资料:
  • 问题内容: 假设我们有以下代码: 当我们创建一个对象时,该对象最初称为父类构造函数。但是就像私人的一样- 我们收到一个错误。一个好的例子和解决这个问题的方法是多少? 问题答案: 没有出路。你必须创建一个可用的(,或默认)的超级构造函数能够延长。 这种表示法通常用于实用程序类或单例中,在这种情况下,您不希望用户通过扩展实例和实例化子类,或者只是通过调用类的构造函数来自己创建类的实例。 当您只有一个具

  • 问题内容: 嘿 语言是Java。我想扩展构造函数具有参数的此类。 这是主要的课程 这是儿童班 如何编写正确的语法?并且错误是“构造函数无法应用于给定类型” 问题答案: 您可以定义构造函数所需的任何参数,但是有必要将超类的一个构造函数作为自己的构造函数的第一行来调用。可以使用或来完成。

  • 问题内容: 假设我有以下课程: 我将如何构造一个使用反射? 回答 根据jtahlborn的回答,可以进行以下工作: 问题答案: 您将需要获取该类,找到带有下限T的单个参数的构造函数(在本例中为Object),强制该构造函数可访问(使用方法),最后使用所需的参数调用它。

  • 我有一个带有私有构造函数的单例类,我想为此编写单元测试。 如何使用mockito框架模拟具有私有构造函数的类。 谢谢

  • 问题内容: 假设有一个类,其所有构造函数都声明为private。 例如。: 据我所知,将所有构造函数设为私有类似于将类“ This”声明为 final ,因此无法进行扩展。 但是,我收到的Eclipse消息给我的印象是这是可能的-可以扩展全构造函数私有类。看看这个: 当我尝试使用类似的方法扩展此类时 Eclipse给了我一个错误:“ 隐式超级构造函数This()对于默认构造函数不可见。必须定义一个

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。