Skip to content

Latest commit

 

History

History
118 lines (82 loc) · 2.79 KB

07.面向对象——组合与继承.md

File metadata and controls

118 lines (82 loc) · 2.79 KB

07 面向对象 —— 组合与继承

1 定义一个抽象类

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
}

2 继承抽象类,重写抽象方法

如果你在定义类时没有使用 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
}

3 参数化成员变量

class ArrayElement(conts: Array[String]) extends Element {
  override val contents: Array[String] = conts
}

// => 等价于

class ArrayElement(override val contents: Array[String]) extends Element {
}

4 final 的用法

既可以在方法上,也可以用在类上

定义方法不可被重写

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") 
  } 
} 

5 定义 factory 对象

提供静态方法直接生成一个单例实例:

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)
}