大B:“靜態分派,動態分派,多分派,單分派是visitor模式準備。”
小A:“visitor模式準備?能不能詳細講講,我不明白。”
大B:“可以。”
1、靜態分派:
(1)定義:發生在編譯時期,分派根據靜態類型信息發生,重載就是靜態分派。
(2)什麼是靜態類型:變量被聲明時的類型是靜態類型。
什麼是動態類型:變量所引用的對象的真實類型。
(3)有兩個類,BlackCat,WhiteCat都繼承自。
如下調用
運行結果是:
這樣的結果是因為重載是靜態分派,在編譯器執行的,取決於變量的聲明類型,因為wc,bc都是Cat所以調用的都是feed(Catcat)的函數。
2、動態分派
定義:發生在運行期,動態分派,動態的置換掉某個方法。
還是上麵類似的例子:
;
}這個時候的結果是:
這樣的結果是因為在執行期發生了向下轉型,就是動態分派了。
3、單分派:
定義:根據一個宗量的類型進行方法的選擇。
4、多分派:
(1)定義:根據多於一個宗量的類型對方法的選擇。
(2)說明:多分派其實是一係列的單分派組成的,區別的地方就是這些但分派不能分割。
(3)Java是動態單分派,靜態多分派語言。
大B:“訪問同一類型的集合類是我們最常見的事情了,我們工作中這樣的代碼太常見了。”
這種訪問的特點是集合類中的對象是同一類對象Person,他們擁有功能的方法run,我們調用的恰好是這個共同的方法。在大部份的情況下,這個是可以的,但在一些複雜的情況,如被訪問者的繼承結構複雜,被訪問者的並不是同一類對象,也就是說不是繼承自同一個根類。方法名也並不相同。例如JavaGUI中的事件就是一個例子。
例如這樣的問題,有如下類和方法:
類:PA,方法:runPA;
類:PB,方法:runPB;
類:PC,方法:runPC;
類:PD,方法:runPD;
類:PE,方法:runPE;
有一個集合類。