【问题标题】:Constructor with derived parameters in subclasses子类中具有派生参数的构造函数
【发布时间】:2022-01-17 05:40:05
【问题描述】:

我定义了一个 Trait Box 和两个继承自 Box 的案例类 RedBox 和 BlueBox。我系统的那部分工作正常。现在,我想创建一个新的元素层次结构,以便可以通过这种方式将具有可变属性位置的基本元素 Token 扩展到特定类型的 Box:

abstract class Token {
   var position: Box
}

class RedToken(position: RedBox, val marked: Boolean) extends Token {
   def test() = {
      position = RedBox()
   }
}

我需要 position 属性是可变的,但编译器正在向我抛出“重新分配给 val”。然后,如果我修改构造函数签名以强制 var:

class RedToken(var position: RedBox, val marked: Boolean) extends Token {
}

...我得到“类 RedToken 需要是抽象的,因为未定义 Box 类型的类 Token 中的变量位置”。我无法理解发生了什么,我可以帮忙吗?谢谢

【问题讨论】:

  • 具有公共var 的抽象类不太可能是一个好主意。子类如何知道它们的状态何时发生变化?

标签: scala oop inheritance constructor


【解决方案1】:

使用generic classes 来生成RedToken#position: RedBox

trait Box
class RedBox extends Box

abstract class Token[T <: Box] {
  var position: T
}

class RedToken(var position: RedBox) extends Token[RedBox] {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2023-03-10
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多