2011年5月7日 星期六

5-8. Abstract class

Abstract class 代表的是該 class 是一個抽象的 class,所以不能把該 class 直接 create instance。
Abstract class 通常會包含多個 abstract method,但也可以沒有 abstract method。沒有 abstract method 的 abstract class,通常代表該 class 不是 concrete class,希望使用 subclass 來 create instance。

比如我們有一個 Animal class,但在我們應用中,Animal 只是用來表明所有的動物的 superclass,Animal 並沒定義有 abstract method,此時我們仍會將 Animal 標注為 abstract class。
所以 abstract class 主要是要看它是否代表抽象而言,而非以有無 abstract method 來斷定。當然有 abstract method 的 class 就一定是 abstract class。

在 Java 中,abstract class 需要在 class 前以 abstract modifier 註明該 class 是 abstract class。而 abstract method 也需要以 abstract modifier 註明該 method 是 abstract method。
範例
abstract class C { // 用 abstract 註明本 class 為 abstract class
  abstract void m1(); //用 abstract 註明本 method 為 abstract method
}
當有 subclass 繼承某個 abstract class 時,需要 implements 所有的 abstract method,否則表示該 subclass 仍有尚未 implement 的 abstract method,這時該 subclass 仍需宣告為 abstract class。

Scala 的 abstract class 的概念與 Java 的類似。也是使用 abstract 宣告。
但有點不同之處,Scala 中不需特別宣告 abstract method,也不能宣告某個 method 為 abstract method。只要有某些 method 沒有定義,那些 method 自動會被 Scala 標示為 abstract method。

所謂 method 沒有定義的意思是,method 宣告後沒有對應的程式碼(即沒有使用等號,或 method 後面沒有使用大括號括住的程式碼),就是 method 沒有定義。

範例
abstract class S { // 用 abstract 註明本 class 為 abstract class
  def p: String // 宣告一個 method p,但沒有定義,所以 p 是 abstract method
}
val s = new S // 這是錯誤的,因為 abstract class 不能 create instance

沒有留言:

張貼留言