代码之家  ›  专栏  ›  技术社区  ›  Edward Dale

在scala中,我可以重写包含列表的具体字段并在子类中追加一些内容吗?

  •  5
  • Edward Dale  · 技术社区  · 16 年前

    以下是我所学课程的简化:

    trait RequiredThings {
      val requiredThings: Seq[String]
    }
    
    class SimpleCalculator with RequiredThings {
      val requiredThings = List("a", "b")
    }
    
    class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
      self: SimpleCalculator =>
      override val requiredThings:List[String] = List("c") ::: self.requiredThings
    }
    

    在这个版本中,我使用的是自类型注释,但我并不是完全肯定这就是我要做的事情。我想我可以通过转换 requiredThings 一个方法,但我想尝试它作为一个领域。

    最终解决方案:

    trait RequiredThings {
      def requiredThings: Seq[String]
    }
    
    class SimpleCalculator with RequiredThings {
      def requiredThings = List("a", "b")
    }
    
    class ComplicatedCalculator extends SimpleCalculator with RequiredThings {
      override def requiredThings:List[String] = List("c") ::: super.requiredThings
    }
    
    3 回复  |  直到 16 年前
        1
  •  7
  •   lindydonna    16 年前

    是的,对通过自身类型“继承”的方法的超级调用尚未实现。这很快就会有所改变。同时,您应该使用继承。

        2
  •  4
  •   Lukas Rytz    16 年前

    有趣的是,我昨天也提到了同样的问题。

    当前实现自我类型的方式,如果重写方法(或值),则无法引用被重写的方法。

    以下将循环:

    class A { def foo = "a" }
    trait B { self: A => override def foo = self.foo + "b" }
    

    (注意:您不能打电话 super.foo 的父母 B ScalaObject 不是 A )

    我还尝试了一个间接的方法,但是程序仍然是循环的。

    class A { def foo = "a"; def fooA = A.this.foo }
    trait B { this: A => override def foo = fooA + "b" }
    

    目前有一些关于自我类型的工作正在进行,也许这会改变。

        3
  •  3
  •   oxbow_lakes    16 年前

    有必要 requiredThings 作为一个 def 至少在 trait -这会给你更多的灵活性

    推荐文章