2013-08-19 2 views
1

Я читаю книгу Программирование в Scala (второе издание) Одерски и у меня есть проблемы с примерами в главе 10.Scala компаньон объект абстрактного класса

Это мой файл почти в конце глава:

class Element 
object Element { 

    private class ArrayElement(
    val contents: Array[String] 
) extends Element 

    private class LineElement(s: String) extends ArrayElement(Array(s)) { 
    override def width = s.length 
    override def height = 1 
    } 

    private class UniformElement(
    ch: Char, 
    override val width: Int, 
    override val height: Int 
) extends Element { 
    private val line = ch.toString * width 
    def contents = Array.fill(height)(line) 
    } 

    def elem(contents: Array[String]): Element = 
    new ArrayElement(contents) 

    def elem(chr: Char, width: Int, height: Int): Element = 
    new UniformElement(chr, width, height) 

    def elem(line: String): Element = 
    new LineElement(line) 

} 

abstract class Element { 
    def contents: Array[String] 

    def width: Int = 
    if (height == 0) 0 else contents(0).length 

    def height: Int = contents.length 

    def above(that: Element): Element = 
    elem(this.contents ++ that.contents) 

    def beside(that: Element): Element = 
    elem(
     for (
     (line1, line2) <- this.contents zip that.contents 
    ) yield line1 + line2 
    ) 
} 

компилятор говорит, что это:

defined class Element 
<console>:15: error: method width overrides nothing 
      override def width = s.length 
         ^
<console>:16: error: method height overrides nothing 
      override def height = 1 
         ^
<console>:21: error: value width overrides nothing 
      override val width: Int, 
         ^
<console>:22: error: value height overrides nothing 
      override val height: Int 
         ^
<console>:17: error: not found: value elem 
      elem(this.contents ++ that.contents) 
     ^
<console>:20: error: not found: value elem 
      elem(
     ^

Если удалить class Element с самого начала, то он жалуется, что тип элемента я s не найден, когда я пытаюсь подклассифицировать его.

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

Что я пропустил?

С уважением, Norbert

ответ

4

Во-первых, вы объявляете класс Element дважды - удалить первую строку, это только запутанные вещи (это не вызывает каких-либо ошибок, для меня - если он делает для вас, вы можете показать нам еще больше информации об ошибке?). Это должно исправить ошибки переопределения. Во-вторых, метод elem сопутствующего объекта не будет автоматически виден в классе. Либо префикс с Element везде, где он используется или - лучше - добавить импорт линию в начале класса:

object Element { 
    ... 
} 

abstract class Element { 
    import Element._ 
    ... 
} 

EDIT: Ах, я мог бы иметь представление о том, почему вы получите сообщение об ошибке, когда вы покидаете выключить первая линия. Если вы пытаетесь это сделать в REPL и вводите в него одну строку (или одну декларацию) за раз, вы можете столкнуться с этой проблемой, потому что REPL не любит перенаправленные ссылки. Попробуйте сразу вставить весь код (используя «: paste» в REPL).

+0

Спасибо, проблема была в том, что я поставил импорт в неправильном месте. В книге говорится, что я должен выставить его вне класса. Он работает сейчас. ;) – norbertk

Смежные вопросы