從一個例子說為什麼要用介面
如題,看看下面這個例子 :
現有狗 和企鵝兩個類 ,狗會玩飛碟,企鵝會游泳,為什麼要把玩飛碟和游泳的方法分別定義在兩個接口裡?如果
定義在介面反而顯得程式碼更加累贅,因為還多了兩個介面。你可能會想,幹嘛不直接把玩飛碟的方法直接定義在狗類中,游泳
的方法直接定義在企鵝類中(這種情況下沒有父類)。
假設這樣一種情況:後面又多了一種寵物型別鴨子,鴨子也會游泳,你是不是又要在鴨子類中定義一個游泳的方法?在這裡考
慮一下這個問題:企鵝會游泳,鴨子會游泳,具有共同的特性,既然有共同的特性,為什麼不去抽取?抽取出一個父類。對,沒
錯,你可能會抽取出一個父類A,這個父類中有一個游泳的方法,然後鴨子類和企鵝類都繼承這個父類。(看起來毫無問題)
。
接著繼續:後面我們又發現,鴨子會唱歌了(呱呱呱),你又養了一種新的寵物鸚鵡,而且鸚鵡也會唱歌(嚶嚶嚶),到這裡,
你又發現鴨子和鸚鵡具有共同的特性(唱歌),那就得繼續向上抽取,在這個你會想,能不能把唱歌這個方法定義在剛才的A
類中,仔細想想,這樣行不通(如果是把唱歌這個方法定義在A類中,剛才狗也繼承了A類,那不就狗也會唱歌了【顯然不合理
】),那就換種方式試試:把唱歌這個方法定義在另一個類中(B),然後鸚鵡類繼承B類,鴨子類也繼承B類(好,這裡就出現問
題了:鴨子已經繼承了A類了,不能再繼承B類了,因為類只能單繼承,又出現問題了。在這裡聯想一下,什麼可以多繼承【實
現】,當然是介面了),經過上面的思考,最終決定:把唱歌,游泳,這些方法分別定義在不同的接口裡,然後鴨子類去實現
有唱歌方法的介面,同時也去實現具有游泳方法的介面 ,鸚鵡類去實現有唱歌方法的介面,這樣鴨子既會游泳也會唱歌,鸚
鵡也會唱歌,狗會玩飛碟,企鵝會游泳,在這裡介面的好處就體現出來了,更加的靈活,方便程式的拓展。在這個例子中,接
口體現的是一種能力(類實現了某個介面,這個類就具備了該介面的方法【功能】)