設計模式裡的多型,答疑
阿新 • • 發佈:2019-02-02
著作權歸作者所有。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:楊貴福
連結:http://zhuanlan.zhihu.com/younggift/20484265
來源:知乎
>在java程式設計這門課中,我讀的書上寫到多型有兩種形式,1.一個類中,具
>有相同的方法名,但引數列表不同,稱這種形式為靜態多型性,又叫過載。
>2.子類與父類擁有相同的屬性或方法,稱為動態多型性,又叫覆蓋。過載和覆
>蓋的區別在於,過載在編譯階段就可以知道呼叫哪一個方法,而覆蓋在執行階
>段才能知道呼叫的是子類還是父類的方法。
我沒聽說過動態多型、靜態多型(注:查了一下,這兩個術語是確實存在的,我學業不精沒記住),除此以外,上面提到的內容都是對的。
overload, override.
>設計模式中提到的動態繫結下的多型我覺得屬於覆蓋這種。
對。
設計模式中所有的方法都基於 OO(似乎除了工廠方法),而 overload不是OO。
>文中提到 彼此有相同介面的物件 是指兩個子類繼承自一個父類,然後兩個子
>類所例項化的物件可以相互替換?
可以。
>設計模式第十頁提到:動態繫結允許你在執行時刻彼此替換有相同介面的物件。這種可替換性就稱為多型。這句我不是很理解。
1. 多型,是設計模式這種OO設計手段所依賴的最核心的OO程式設計技術。
所以,你找到核心了。
2. 假設用C++實現。
動物類 有個方法 吃(),那麼動物類的子類 鹿類 和 虎類 都可以有 吃()方法,
為方便起見假設無參或引數型別相同。
鹿類 和 虎類 可以分別實現 吃,那麼就覆蓋了動物類的吃。又,特別的,如果
動物類是個抽象類,吃就只是宣告而沒有實現。在執行時,如下。
以上程式碼中,考慮到使用者輸入在編譯時未知,因此呼叫鹿::吃()還是虎::吃(),
是在執行時決定的。
這就是"動態繫結允許你在執行時刻彼此替換有相同介面的物件。這種可替換性
就稱為多型。"這不是設計模式的內容,而是設計模式應用了OOP中的多型。
3. 如果用JAVA實現多型,可以不用繼承,而使用介面。
某類a、類b實現了介面i,在多型的角度 可以把 類a、類b 視為子類,把 介面i
視為超類,類a、類b 的方法eatable () 實現 (或覆蓋)了介面i中宣告的方法
。只有在執行時才知道,介面i的例項是a類型別還是b類型別,eatable ()方法
的呼叫到底是a.eatable ()還是 b.eatable ()。總之執行時不會呼叫i.eatable
(),因為它是純抽象的。
4. 在設計模式中,大量使用了多型,並且基類是抽象類,只有方法的宣告,不
做實現。正是因為在執行時決定子類 (及其方法) ,帶來了設計模式的靈活性。
> 老師:求助解答。設計模式第十頁提到:動態繫結允許你在執行時刻彼此替
> 換有相同介面的物件。這種可替換性就稱為多型。這句我不是很理解。在
> java程式設計這門課中,我讀的書上寫到多型有兩種形式,1.一個類中,
> 具有相同的方法名,但引數列表不同,稱這種形式為靜態多型性,又叫重
> 載。2.子類與父類擁有相同的屬性或方法,稱為動態多型性,又叫覆蓋。
> 過載和覆蓋的區別在於,過載在編譯階段就可以知道呼叫哪一個方法,而
> 覆蓋在執行階段才能知道呼叫的是子類還是父類的方法。設計模式中提到
> 的動態繫結下的多型我覺得屬於覆蓋這種。文中提到 彼此有相同介面的對
> 象 是指兩個子類繼承自一個父類,然後兩個子類所例項化的物件可以相互
> 替換?
>
>
> 發自ZR的小米手機
------------------------------------------------------------
部落格會手工同步到以下地址:
[ http://zhuanlan.zhihu.com/younggift]
[楊貴福 的專欄]
[http://giftdotyoung.blogspot.com] 我本人也訪問不到了,blogspot暫停更新。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:楊貴福
連結:http://zhuanlan.zhihu.com/younggift/20484265
來源:知乎
>在java程式設計這門課中,我讀的書上寫到多型有兩種形式,1.一個類中,具
>有相同的方法名,但引數列表不同,稱這種形式為靜態多型性,又叫過載。
>2.子類與父類擁有相同的屬性或方法,稱為動態多型性,又叫覆蓋。過載和覆
>蓋的區別在於,過載在編譯階段就可以知道呼叫哪一個方法,而覆蓋在執行階
>段才能知道呼叫的是子類還是父類的方法。
我沒聽說過動態多型、靜態多型(注:查了一下,這兩個術語是確實存在的,我學業不精沒記住),除此以外,上面提到的內容都是對的。
overload, override.
>設計模式中提到的動態繫結下的多型我覺得屬於覆蓋這種。
對。
設計模式中所有的方法都基於 OO(似乎除了工廠方法),而 overload不是OO。
>文中提到 彼此有相同介面的物件 是指兩個子類繼承自一個父類,然後兩個子
>類所例項化的物件可以相互替換?
可以。
>設計模式第十頁提到:動態繫結允許你在執行時刻彼此替換有相同介面的物件。這種可替換性就稱為多型。這句我不是很理解。
1. 多型,是設計模式這種OO設計手段所依賴的最核心的OO程式設計技術。
所以,你找到核心了。
2. 假設用C++實現。
動物類 有個方法 吃(),那麼動物類的子類 鹿類 和 虎類 都可以有 吃()方法,
為方便起見假設無參或引數型別相同。
鹿類 和 虎類 可以分別實現 吃,那麼就覆蓋了動物類的吃。又,特別的,如果
動物類是個抽象類,吃就只是宣告而沒有實現。在執行時,如下。
動物類 ani* a ; switch (使用者輸入) { case 虎: a = new 虎(); a -> 吃(); //是虎在吃,呼叫的是 虎::吃() break; case 鹿: a = new 鹿(); a -> 吃(); //是鹿在吃,呼叫的是 鹿::吃() break; } delete a;
以上程式碼中,考慮到使用者輸入在編譯時未知,因此呼叫鹿::吃()還是虎::吃(),
是在執行時決定的。
這就是"動態繫結允許你在執行時刻彼此替換有相同介面的物件。這種可替換性
就稱為多型。"這不是設計模式的內容,而是設計模式應用了OOP中的多型。
3. 如果用JAVA實現多型,可以不用繼承,而使用介面。
某類a、類b實現了介面i,在多型的角度 可以把 類a、類b 視為子類,把 介面i
視為超類,類a、類b 的方法eatable () 實現 (或覆蓋)了介面i中宣告的方法
。只有在執行時才知道,介面i的例項是a類型別還是b類型別,eatable ()方法
的呼叫到底是a.eatable ()還是 b.eatable ()。總之執行時不會呼叫i.eatable
(),因為它是純抽象的。
4. 在設計模式中,大量使用了多型,並且基類是抽象類,只有方法的宣告,不
做實現。正是因為在執行時決定子類 (及其方法) ,帶來了設計模式的靈活性。
> 老師:求助解答。設計模式第十頁提到:動態繫結允許你在執行時刻彼此替
> 換有相同介面的物件。這種可替換性就稱為多型。這句我不是很理解。在
> java程式設計這門課中,我讀的書上寫到多型有兩種形式,1.一個類中,
> 具有相同的方法名,但引數列表不同,稱這種形式為靜態多型性,又叫重
> 載。2.子類與父類擁有相同的屬性或方法,稱為動態多型性,又叫覆蓋。
> 過載和覆蓋的區別在於,過載在編譯階段就可以知道呼叫哪一個方法,而
> 覆蓋在執行階段才能知道呼叫的是子類還是父類的方法。設計模式中提到
> 的動態繫結下的多型我覺得屬於覆蓋這種。文中提到 彼此有相同介面的對
> 象 是指兩個子類繼承自一個父類,然後兩個子類所例項化的物件可以相互
> 替換?
>
>
> 發自ZR的小米手機
------------------------------------------------------------
部落格會手工同步到以下地址:
[
[楊貴福 的專欄]
[http://giftdotyoung.blogspot.com] 我本人也訪問不到了,blogspot暫停更新。