1. 程式人生 > >抽象類和介面之間的關係

抽象類和介面之間的關係

1。類可以實現多個介面而只能繼承一個超類。
2。抽象類可以有非抽象方法而介面的方法只能都是抽象的。
3。抽象類可以定義和使用變數而介面則不可以。
4。抽象類中的方法可以有各種不同的修飾符,而介面中的方法預設都是public,不允許字面定修飾符。
一個介面中的成員函式可以在不同的類中安裝,而它的成員函式可以有很多種的實現方法,但是抽象類卻不能象這樣,它必須是由子類來繼承,然後由子類來實現它的成員函式,如果其他的孫類繼承了這個子類,只能過載這成員函式,但是抽象類的實現方法卻不能改變。

1。從類的層次結構上看,抽象類通常是在層次的頂端,但在實際的設計實踐當中,抽象類應當是最後出現的,換句話說,應當是先有具體類後有抽象類。為什麼?實際上抽象類的獲取有點像數學中的提取公因式:ax+bx+cx,x就是抽象類,如果你沒有前面的式子,你怎麼知道x是不是公因式呢?在這點上,也符合人們認識世界的過程,先具體後抽象。因此在設計過程中如果你得到大量的具體概念並從當中找到其共性時,這個共性的集合就是抽象類應當是沒錯的。
2。interface從表面上看,和抽象類很相似,但用法完全不同。它的基本功能就是把一些毫不相關的類(概念)集合在一起形成一個新的、可集中操作的“新類”。我給學生的一個典型例子就是“司機”。誰可以當司機?誰都可以,只要領取了駕照。所以我不管你是學生,白領、藍領還是老闆,只要有駕照就是司機。
interface Driver {
    Licence getDriverLicence();
}
class StudentDriver implements Driver {
}
class WhtieCollarEmployeeDriver implements Driver {
}
class BlueCollarEmployeeDriver implements Driver {
}
class BossDriver extends implements Driver {
}

當定義了“汽車”類後,就可以指定“司機”了。
class Car {
    setDriver(Driver driver);
}
這時候,Car的物件並不關心這個司機到底是幹什麼的,他們的唯一共同點是領取了駕照(都實現了DriverLicence介面)。這個,應當是介面最強大的地方也是抽象類無法比擬的。

總結:抽象類是提取具體類的公因式,而介面是為了將一些不相關的類“雜湊”成一個共同的群體。至於他們在各個語言中的句法,語言細節並不是這裡關心的重點。