Абстрактный метод Scala является пустым в суперклассе, когда подкласс реализует его с помощью val?

Я нашел ошибку в своем коде scala, который озадачивает меня. Ниже упрощенная версия проблемы.

В конструкторе абстрактного класса я хочу проверить, что некоторые утверждают об абстрактных методах. Таким образом, когда объект подкласса сделан, они утверждают, проверяются, чтобы видеть, реализовано ли все, как он должен.

Это идет не так, как надо, когда подкласс реализует абстрактный метод с помощью "val" однако:

Код Scala:

abstract class A {
    def aval : String
    assert(aval != null, "aval == null")
    assert(aval == "B", "aval: "+aval)
}

class B extends A {
    def aval = "B"
}

class C extends A {
    val aval = "B"
}

object VariousScalaTests {
    def main(args : Array[String]) : Unit = {
        val b = new B
        val c = new C
    }
}

Ошибка Scala:

Exception in thread "main" java.lang.AssertionError: assertion failed: aval == null
    at scala.Predef$.assert(Predef.scala:92)
    at A.<init>(VariousScalaTests.scala:4)
    at C.<init>(VariousScalaTests.scala:12)
    at VariousScalaTests$.main(VariousScalaTests.scala:19)
    at VariousScalaTests.main(VariousScalaTests.scala)

Таким образом, это перестало работать в последней строке кода: "val c = новый C". Класс B работает отлично, но класс C не делает! Единственная разница - то, что C реализует аваль с помощью "val" и B использование "определения".

Так мой вопрос, больше всего, почему это различие? Я не понимаю то, что продолжается.

И есть ли способ заставить его работать, как я хочу в обоих случаях в scala? Или я просто пропускаю более изящный способ утверждать то, что я хочу в scala?

5
задан Coder Nr 23 28 July 2010 в 13:13
поделиться