Scala是带有抽象类的伴生对象
我正在读Martin Odersky的《Scala编程》(第二版),我对第10章中的示例有一个问题 这是我在本章末尾的文件: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)) {
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
,谢谢,问题是我将导入放在了错误的位置。在书中,它说我必须将其放在类外。它现在起作用了。)谢谢,问题是我把进口放错地方了。书中说我必须把它放在课堂之外。现在可以用了。;)