作者Favonia (小西風最乖了*^^*)
看板C_and_CPP
標題Re: [問題] 子類別陣列轉型成父類別指標問題
時間Fri Jun 8 03:23:21 2012
※ 引述《whoowh (AA)》之銘言:
: → loveme00835:你所謂的"直觀"實際上是對語意上的誤解, Derived is a 06/07 13:14
: → loveme00835:Base 物件, 但 Derviced '物件陣列' is not a Base 06/07 13:14
: → loveme00835:'物件陣列', 再來就是對陣列做 [] 取值行為, 則是假設 06/07 13:15
其實重點都被別人講完了,這邊稍微補充一下...
之所以 A 繼承 B 時一般來說 A 陣列不算繼承 B 陣列,是因為陣列
可以寫。如果今天是只能讀的陣列,那元素型態在正的位置(因為元素型
態愈自由,輸出的函式愈好寫),所以是 A 陣列可以算繼承 B 陣列。如
果今天是只能寫的陣列,則元素型態在負的位置(因為元素型態愈自由,
寫入的函式拿到的資料就愈少,程式愈難寫),所以 B 陣列可以算繼承
A 陣列。如果可以讀又可以寫,則陣列之間不能有什麼有趣的繼承關係。
有三個術語在講這件事情,唯讀陣列對元素型態來說 covariant, 只
能寫的陣列對元素型態來說 contravariant, 第三種,也就是你用的陣列
對元素型態應該要是 invariant. 這不是什麼語法強加的限制,而是本來
就不能亂轉。
是說 Java 的設計犯了這種錯誤 [1] ,不知道 Scala 有沒有改掉。
[1]
http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.39
※ 編輯: Favonia 來自: 140.112.30.39 (06/08 03:27)
推 loveme00835:網站不錯 :) 06/08 08:18
推 Chikei:改了,compiler會明確的講Array是invariant in T 06/08 14:57
※ 編輯: Favonia 來自: 140.112.30.39 (06/08 16:50)