abstract class Element {
// 添加一个没有方法体的抽象方法(目的:我声明有这个方法,你必须要去实现)
def contents: Array[String]
//定义两个无参方法 height 与 width。
// 关于方法是否加括号的问题:如果该方法产生副作用,那么需要加括号。如果该方法不产生副作用,或者是只读的,那么不加括号。
// 除了没有副作用,此外,height 与 width 可以完全替换为成员变量,因此是访问函数,不需要被重写。 (这称为 uniform access principle)
def height: Int = contents.length
def width: Int = if (height == 0) 0 else contents(0).length
}
如果你在定义类时没有使用 extends
关键字,在 Scala
中,这个定义类默认继承自 scala.AnyRef
,如同在 Java 中缺省继承自 java.lang.Object
继承关系图
scala.AnyRef
^
|
Element
<<abstract>>
^
|
ArrayElement <--- Array[String]
class ArrayElement(conts: Array[String]) extends Element {
override def contents: Array[String] = conts
}
class ArrayElement(conts: Array[String]) extends Element {
override val contents: Array[String] = conts
}
// => 等价于
class ArrayElement(override val contents: Array[String]) extends Element {
}
既可以在方法上,也可以用在类上
定义方法不可被重写
class ArrayElement extends Element {
final override def demo() {
println("ArrayElement's implementation invoked")
}
}
定义不可变对象
final class ArrayElement extends Element {
override def demo() {
println("ArrayElement's implementation invoked")
}
}
提供静态方法直接生成一个单例实例:
object Element {
private class ArrayElement(val contents: Array[String])
extends Element {
}
private class LineElement(s: String) extends ArrayElement(Array(s)) {
override def width: Int = 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[String] = 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)
}