1 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
單說你的這一句問題“不能重新定義一個(gè)抽象類來描述兩個(gè)對(duì)象的特征嗎?”
其實(shí)是可以這樣定義的。
假如你的程序中只有“智能機(jī)類”和“PSP類”這兩個(gè)類,并且你只是想單純地對(duì)這兩個(gè)進(jìn)行抽象,那可以像你說的這樣:抽象出一個(gè)“可玩游戲的電子產(chǎn)品類”。 然后從它派生出“能打電話的可玩游戲電子產(chǎn)品——手機(jī)”和“專門玩游戲的電子產(chǎn)品——PSP”。 ?這樣使用單繼承也還算能勉強(qiáng)適合這種簡(jiǎn)單的抽象。
不過你有沒有覺得這樣抽象在邏輯上似乎不那么貼切?
智能機(jī)本質(zhì)是手機(jī),玩游戲并不是必備功能,所以按說“智能機(jī)類”可以繼承自“手機(jī)類”?!笆謾C(jī)類”可以有打電話的功能。
而 PSP 本身就是游戲機(jī),也許可以讓它繼承自“掌機(jī)類”。
掌機(jī)和手機(jī)在概念上沒什么關(guān)系,也就不適合從更低層的“玩游戲的電子產(chǎn)品”繼承而來了。
所以當(dāng)你想擴(kuò)展你的程序、加入更多的抽象層次時(shí),如果仍只采用類來抽象而不用接口的話,就會(huì)遇到很多麻煩。而這正是因?yàn)?Java 中沒有多繼承。?
因?yàn)?Java 沒有多繼承,也就不能用?同時(shí)繼承多個(gè)基類的辦法?來表示同時(shí)具有多個(gè)抽象概念。 所以就引入了“接口”來表達(dá)不同的抽象概念。而且這樣還能很好地進(jìn)行語(yǔ)義上的區(qū)分:
class 在語(yǔ)法上表示類型,并且多個(gè) class 可以組織成繼承體系來表示不同抽象層次的類型。在語(yǔ)義層面上用 class 來表示“對(duì)象”(以此進(jìn)行所謂“面向?qū)ο蟆本幊蹋?,并?strong>在語(yǔ)義上?class 偏向?qū)Α皩?shí)體”的抽象。
interface 并不是 class。在語(yǔ)法層面上你可以把 interface 看作是對(duì) class 施加的規(guī)范——它要求實(shí)現(xiàn)它的 class 必須實(shí)現(xiàn)相應(yīng)的 method 等。 而?interface 在語(yǔ)義上更偏向于對(duì)“功能”的抽象。
所以你最后一句話的理解方向是對(duì)的! ?Java 在設(shè)計(jì)上沒有選擇使用多繼承,而是選擇通過接口來對(duì)“對(duì)象的各種功能特性”作抽象,因此接口可以進(jìn)行多繼承,接口也可以組織成繼承體系。 ?這樣的好處是可以在語(yǔ)義層面進(jìn)行更細(xì)致的區(qū)分。
還用你題目中的例子作分析:
智能機(jī)和 PSP 都能玩游戲。這個(gè)“玩游戲”應(yīng)看作是一種功能,所以抽象為接口。而“智能機(jī)”和“PSP”本身更像“實(shí)體”的概念,應(yīng)被抽象為類。
這樣,“智能機(jī)類” 繼承自“手機(jī)類”并實(shí)現(xiàn)“玩游戲接口”。而“PSP類”也可以實(shí)現(xiàn)“玩游戲接口”,同時(shí)完全不屬于手機(jī)的概念,它可以繼承自“掌機(jī)類”之類的。 ? ?這看起來要合理多了。
添加回答
舉報(bào)