Scala是带有抽象类的伴生对象

Scala是带有抽象类的伴生对象,scala,Scala,我正在读Martin Odersky的《Scala编程》(第二版),我对第10章中的示例有一个问题 这是我在本章末尾的文件: class Element object Element { private class ArrayElement( val contents: Array[String] ) extends Element private class LineElement(s: String) extends ArrayElement(Array(s)) {

我正在读Martin Odersky的《Scala编程》(第二版),我对第10章中的示例有一个问题

这是我在本章末尾的文件:

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
    )
}
类元素
对象元素{
私有类排列(
val内容:数组[字符串]
)扩展元素
私有类LineElement(s:String)扩展了ArrayElement(数组)){
覆盖def宽度=s长度
覆盖def高度=1
}
私家军装(
ch:Char,
覆盖值宽度:Int,
覆盖值高度:Int
)扩展元素{
private val line=ch.toString*width
def内容=阵列填充(高度)(行)
}
def元素(内容:数组[字符串]):元素=
新排列(目录)
def元素(chr:Char,width:Int,height:Int):元素=
新制服(颜色、宽度、高度)
定义元素(行:字符串):元素=
新线元素(线)
}
抽象类元素{
定义内容:数组[字符串]
定义宽度:Int=
如果(高度==0)0其他内容(0).length
定义高度:Int=contents.length
def以上(即:元素):元素=
元素(this.contents++that.contents)
def旁边(that:Element):Element=
元素(
为了(

(第1行,第2行)首先,您声明了两次class元素-删除第一行,这只会让事情变得混乱(这不会对我造成任何错误-如果对您造成任何错误,您可以向我们展示有关错误的更多信息吗?)。这将修复覆盖错误。其次,来自伴生对象的方法
elem
在类中不会自动可见。可以在使用该方法的任何位置使用
Element
作为前缀,或者最好在类的开头添加导入行:

object Element {
  ...
}

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

编辑:啊,我可能知道为什么当你离开第一行时会出现错误。如果你在REPL中尝试这一点,并一次输入一行(或一个声明),那么你可能会遇到这个问题,因为REPL不喜欢所需的正向引用。试着一次粘贴所有代码(在REPL中使用“:paste”).

首先,您声明了两次class元素-删除第一行,这只会让事情变得混乱(这不会对我造成任何错误-如果对您造成任何错误,您可以向我们展示有关错误的更多信息吗?)。这将修复覆盖错误。其次,来自伴生对象的方法
elem
在类中不会自动可见。可以在使用该方法的任何位置使用
Element
作为前缀,或者最好在类的开头添加导入行:

object Element {
  ...
}

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

编辑:啊,我可能知道为什么当你离开第一行时会出现错误。如果你在REPL中尝试这一点,并一次输入一行(或一个声明),那么你可能会遇到这个问题,因为REPL不喜欢所需的正向引用。试着一次粘贴所有代码(在REPL中使用“:paste”).

对于
元素
,有一个伴生对象和伴生类,我认为它们可以在不导入
的情况下访问彼此的成员。
但是,同伴似乎只能访问受
private
保护的成员,而不能进行名称解析。
因此,您可能必须事先添加
import
,以便只使用
elem

访问
元素
对象的
elem
元素
有一个伴生对象和一个伴生类,我认为它们可以在不使用
import
的情况下访问彼此的成员。 但是,同伴似乎只能访问受
private
保护的成员,而不能进行名称解析。
因此,您可能必须事先添加
import
,以便仅使用
elem

访问
元素
对象的
elem
,谢谢,问题是我将导入放在了错误的位置。在书中,它说我必须将其放在类外。它现在起作用了。)谢谢,问题是我把进口放错地方了。书中说我必须把它放在课堂之外。现在可以用了。;)