3 回答

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果可以通過(guò)“ a” interface或“ a” 來(lái)引用對(duì)象class,則應(yīng)首選后者,但前提是存在適當(dāng)?shù)念?lèi)型。
考慮一個(gè)例子。你不應(yīng)該只是一味地用在preferrence到所有情況,因?yàn)檫@會(huì)剝奪你喜歡簡(jiǎn)單的操作,等等。StringimplementsCharSequenceCharSequenceStringtrim()toUpperCase()
但是,應(yīng)該改用String只關(guān)心其char值序列的方法,因?yàn)樵谶@種情況下,這是合適的類(lèi)型。實(shí)際上,在課堂上就是這種情況。CharSequencereplace(CharSequence target, CharSequence replacement)String
另一個(gè)例子是java.util.regex.Pattern它的Matcher matcher(CharSequence)方法。這樣一Matcher來(lái)Pattern,不僅可以從創(chuàng)建String,而且還可以為所有其他創(chuàng)建的對(duì)象CharSequence。
可以在以下位置找到庫(kù)中的一個(gè)很好的例子,該例子中interface應(yīng)該使用a,但不幸的是沒(méi)有使用a Matcher:它的appendReplacement和appendTail方法僅接受StringBuffer。StringBuilder從1.5 開(kāi)始,該類(lèi)別已被其更快的表親取代。
A StringBuilder不是a StringBuffer,因此我們不能將前者與中的append…方法一起使用Matcher。但是,它們兩者implementsAppendable(也在1.5中引入)。理想情況下Matcher,的append…方法應(yīng)該接受any Appendable,然后我們就可以使用StringBuilder,以及所有其他Appendable可用的方法!
因此,我們可以看到,當(dāng)存在適當(dāng)?shù)念?lèi)型時(shí),如何通過(guò)它們的接口引用對(duì)象可以成為強(qiáng)大的抽象,但是前提是這些類(lèi)型存在。如果類(lèi)型不存在,那么可以考慮定義自己的類(lèi)型。Cat例如,在此示例中,您可以定義interface SelfBathable。然后Cat,您可以接受任何SelfBathable對(duì)象(例如Parakeet),而不是引用a
如果創(chuàng)建新類(lèi)型沒(méi)有意義,那么您可以通過(guò)其引用它c(diǎn)lass。
也可以看看
有效的Java 2nd Edition,項(xiàng)目52:通過(guò)其接口引用對(duì)象
如果存在適當(dāng)?shù)慕涌陬?lèi)型,則應(yīng)使用接口類(lèi)型聲明參數(shù),返回值和字段。如果您習(xí)慣于使用接口類(lèi)型,那么您的程序?qū)⒏屿`活。如果不存在適當(dāng)?shù)慕涌?,則完全可以通過(guò)類(lèi)來(lái)引用對(duì)象。

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
您是正確的,但是如果需要,可以從界面投射到所需的寵物。例如:
PetInterface p = new Cat();
((Cat)p).batheSelf();
當(dāng)然,如果您嘗試將寵物扔給狗,則無(wú)法調(diào)用batheSelf()方法。它甚至不會(huì)編譯。因此,為避免出現(xiàn)問(wèn)題,您可以使用以下方法:
public void bathe(PetInterface p){
if (p instanceof Cat) {
Cat c = (Cat) p;
c.batheSelf();
}
}
使用時(shí)instanceof,請(qǐng)確保不會(huì)在運(yùn)行時(shí)嘗試讓狗自己洗澡。這將引發(fā)錯(cuò)誤。
添加回答
舉報(bào)