我們都知道,什么是接口,什么是繼承,那么在什么場(chǎng)景下我們使用繼承,又在什么場(chǎng)景中使用接口?
繼承:子類會(huì)繼承父類的屬性和方法,但是卻不需要重寫(xiě)父類的方法,父類和子類存在著包含關(guān)系,比如動(dòng)物和鳥(niǎo)
接口:繼承該接口的類同樣也會(huì)完全繼承接口的屬性,方法必須重寫(xiě),在大多數(shù)情況下,定義的接口實(shí)際上只有方法沒(méi)有屬性。
使用繼承的場(chǎng)景一般是為了給實(shí)體類添加額外屬性或者提取共同屬性而創(chuàng)建一個(gè)的基類,這時(shí)實(shí)體類繼承這個(gè)基類,就具有了額外屬性或者共同屬性。
使用接口的場(chǎng)景就廣泛的多,當(dāng)一個(gè)類有共同的使命,比如說(shuō)要完成一件共同的事,可能他們之間并沒(méi)有任何關(guān)系,只是做的事情相同,比如Mybatis 里的 Executor 就是典型的接口,只是為了執(zhí)行對(duì)數(shù)據(jù)庫(kù)的操作 。
確定一個(gè)公共的接口一定要小心,因?yàn)橐坏┠愀牧私涌冢鸵詾橹阈枰乃袑?shí)現(xiàn)這個(gè)接口的類。或者進(jìn)一步的說(shuō)就是抽象類的演化相比較接口要容易得多。
抽象類只能單繼承,這意味著它在擴(kuò)展方面是不如接口的。
舉一個(gè)繼承的例子,比如在一個(gè)大型公司內(nèi)部使用的管理職員的網(wǎng)站中,我們可以把一些必須具有的屬性以及為了方便我們操作比如從數(shù)據(jù)庫(kù)取出數(shù)據(jù)以后為了翻譯而要添加的屬性。主鍵id 這個(gè)每個(gè)用戶都有,實(shí)體屬性來(lái)源origin,實(shí)體屬性版本ts,實(shí)體屬性刪除標(biāo)志dr,實(shí)體屬性租戶tenant_id。這些信息放在基類里,以后添加的每個(gè)實(shí)體類繼承這個(gè)類就具有了這些屬性,也就能完成我們想要的操作。