Quiz1
Javascript真的需要類(Class)嗎?
我們首先先看下其他有類(Class)的物件導向語言(如: Java)的一些特性。
父類與子類
父類(Superclass)和子類(Subclass),並不是為瞭解決父親與兒子的 問題,而是為瞭解決類的內含項目關聯性的,我們用Sub表示“子類”,用Sup表示“父類”,則有:
Sub Sup
這是有區別的,例如通常我們能夠將子類當成父類來使用,但認人的時候我們並不能把兒子當成父親。
或者可以這 麼說,父類和子類不是為瞭解決類間存在相同方法或者屬性的。
舉個例子
有人喜歡這樣做:
我們需 要一些動物的類,以便在螢幕上建立一些移動的動物,但移動的動物有些在空中飛行,有些在路上行走。
所以建立 兩個父類,一個是Fly,一個是Walk:
Class Fly{ fly(){}} Class Walk{ walk(){}}
然後獅子們(還可以再建些其他的在路上行走的動物)就屬於Walk類,老鷹們(也還可以再建些其他在天上飛行 的動物)就屬於Fly類:
Class Lion extend Walk{} Class Eagle extend Fly{}
最後對Lion和Eagle類建立一些執行個體,調用相應的方法,螢幕上就會有一些獅子和老鷹在移動了。
但這可 能並不是一個好的設計,比如明天老闆突然一拍大腦,他要有一種叫天馬(Pegasus)的動物,它們即會在天上飛,又會在 路上走,時而要飛行,時候要行走。
在這種情況下,這個方案就全然無用了。
為什麼這個設計失敗了?
繼承是有條件的,子類必須能嚴格的向上轉型(變成父類)。
在上面這個例子中:
獅子(Lion)被 假設等同於行走動物(Walk),老鷹(Eagle)被假設等同于飛行動物(Fly)。
這看起來很成功,因為子類能嚴格向上 轉型,但他有隱患。
當有一種天馬(Pegasus)介入到裡面的時候,我們才發現獅子其實只是“會行走的動物”,老鷹其 實只是“會飛行的動物”,這不意味著動物一輩子只能飛行或者行走,所以即會飛行又會行走的天馬就找不到自己的歸屬了 。
這個例子很好的證明了,子類和父類不是為瞭解決類間具有相同的方法的:
一些動物都會行走,需要擁有 行走(Walk)這個方法,但這不應該由子類和父類實現。