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

Scala:是否可以在子类的构造函数中重写VAL?

曹焱
2023-03-14

是否可以在子类的构造函数中重写vals或defs?我想初始化(或设置)子类构造函数中的trait的成员或抽象类的成员作为参数

下面是一个例子。

trait A {
  def memberDef: Int => String
  val memberVal: String
}

class B(
    override val memberDef: Int => String,
    override val memberVal: String)
  extends A {
  ...
}

当我编译这个的时候,没有任何错误。但是,我想知道这个实现中是否有bug,或者哪里有更好的实现。

共有1个答案

全昊焜
2023-03-14

帖子标题的答案是肯定的。大部分都是。

很难说什么可能是“更好的”实现,因为我不知道您试图用这段代码完成什么(除了概念证明)。但有两件事要考虑。

您通常不希望有val的特征。只有在特征级别使用lazy valdef才能解决一些棘手的、文档丰富的初始化问题。此外,虽然特征中的def可以由defval惰性val对象实现,但特征中的val只能由val实现。所以这里的灵活性要小得多。

另一个需要考虑的是Scala语法,而更多的是一般的对象设计。我知道您的示例是虚构的,但请记住,您通过向调用方提供一种更改b的公共API的方法,创建了一个泄漏的抽象。漏泄的抽象从来都不是好事。

 类似资料:
  • 为什么在派生类构造函数中调用超类构造函数时id的值为0?当创建子对象时,什么时候在堆中为该对象分配内存?在基类构造函数运行之后还是之前?

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • 问题内容: 假设我有一个Base类,该类具有一个带有TextBox对象作为参数的单个参数构造函数。如果我有以下形式的简单类: 我会收到一条错误消息,告诉我对super的调用必须是构造函数中的第一个调用。但是,奇怪的是,我可以做到这一点。 为什么允许这样做,但第一个例子不允许?我可以理解需要先设置子类,并且可能不允许在调用超级构造函数之前实例化对象变量。但是t显然是方法(局部)变量,那么为什么不允许

  • null 我不太确定如何处理我的代码,以下是我得到的: 我只是不知道我应该打什么。我相信我已经完成了第一个重载构造函数,但我对此还是新手。 那么,我应该做些什么来使重载构造函数工作呢? 我对Java和面向对象编程非常陌生。

  • 问题内容: 编译该程序时,出现错误- 错误-找不到构造函数Person()。为什么定义Person()是必要的? 问题答案: 创建时,您要同时创建一个。为了确保构造正确,编译器在构造函数中添加了一个隐式调用: 由于没有无参数构造函数,因此失败。 您可以通过以下任一方式解决它 添加对super的显式调用,如下所示: } 或通过将no-arg构造函数添加到: } 通常,编译器还会隐式添加无参数构造函数