Android abstract class和interface

abstract classinterface是Java語言中對於抽像類定義進行支持的兩種機制,正是由於這兩種機制的存在,才賦予了Java強大的面向對像能力。其實,兩者之間還是有很大的區別的,以下就會進行說明,若有誤,請留言糾正我。
abstract class方式中,可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface方式的實現中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。從某種意義上說,interface是一種特殊形式的abstract class。


首先,abstract class在Java語言中表示的是一種“繼承”關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface。也許,這是Java語言的設計者在考慮Java對於多重繼承的支持方面的一種折中考慮吧。

如果我們對於問題領域的理解是:AlarmDoor在概念本質上是Door,同時它有具有報警的功能。我們該如何來設計、實現來明確的反映出我們的意思呢?前面已經說過,abstract class在Java語言中表示一種繼承關係,而繼承關係在本質上是"is a"關係。所以對於Door這個概念,我們應該使用abstarct class方式來定義。另外,AlarmDoor又具有報警功能,說明它又能夠完成報警概念中定義的行為,所以報警概念可以通過interface方式定義。如下所示:
abstract class Door {  

 abstract void open();  

 abstract void close();  

}  

interface Alarm {  

 void alarm();  

}  

class AlarmDoor extends Door implements Alarm {  

 void open() { … }  

 void close() { … }  

    void alarm() { … }  

}  

這種實現方式基本上能夠明確的反映出我們對於問題領域的理解,正確的揭示我們的設計意圖。其實abstract class表示的是"is a"關係,interface表示的是"like a"關係,大家在選擇時可以作為一個依據,當然這是建立在對問題領域的理解上的,比如:如果我們認為AlarmDoor在概念本質上是報警器,同時又具有Door的功能,那麼上述的定義方式就要反過來了。

原文網址覺得寫得非常詳細清楚,因此做個筆記

留言

這個網誌中的熱門文章

Android - 使用 adb 安装apk

Android TextView autosizing 自動調整大小

Kotlin - 實現Android中的Parcelable