類型的組成結構決定的呢?還是由名字決定呢?
由類型的組成結構決定的subtype是這樣的:如果類型一具有了類型二的所有需要具備的屬性和方法,就說類型一是類型二的subtype.
由類型名字決定的subtype是這樣的:隻有當類型一具有了類型二的所有需要具備的屬性和方法,並且類型一被明確聲明為類型二的subtype時,才認可這種關係。
而如果的選擇是一,那麼那些屬性和方法是subtype所必需具備的呢?哪些是可有可無的呢?
由組成結構決定的subtype能夠在分布式環境和objectpersistence係統下進行類型匹配。缺點是,如果兩個類型碰巧具有了相同的結構,但實際上卻風馬牛不相及,那就會造成錯誤。不過,這種錯誤是可以用一些技術來避免的。
相比之下,基於名字的subtype不容易精確定義,而且也不支持基於結構的subtype.
目前,可以先定義一個簡單的基於結構的subtype關係:
對兩個類型O和O’,
O’<:O當O’具有所有O類型的成員。O’可以有多於O的成員。
例如:ReCell<:Cell.
為了簡明,這個定義沒有考慮到方法的特化。
另外,當類型定義有遞歸存在的時候(類似於鏈表的定義),對subtype的定義需要額外地加小心。
因為不關心成員的順序,這種subtype的定義自動地就支持多重的subtype.
比如說:
ObjectTypeReIntegeris
vars:Integer;
varbackup:Integer;
methodrestore();
end;
那麼,就有如下的subtype的關係:
ReCell<:Cell
ReCell<:ReInteger
(按,例子中沒有考慮到象interface不能包含數據域這樣的細節。實際上,如果支持對數據域的override,而不支持shadowing--作者的基於結構的subtype語義確實隱含著這樣的邏輯―那麼,interface裡包含不包含數據域就無關緊要了,因為令人頭疼的名字衝突問題已經不存在了)
從這個定義,可以得出:
如果c’是c的子類,那麼ObjectTypeOf(c’)<:ObjectTypeOf(c)
注意,這個定義的逆命題並不成立,也就是說:
即使c’和c之間沒有subclass的關係,隻要它們所定義的成員符合了subtype的定義,ObjectTypeOf(c’)<:ObjectTypeOf(c)仍然成立。
回過頭再看看在前麵的subclass-is-subtyping:
InstanceTypeOf(c’)<:InstanceTypeOf(c)當且僅當c’是c的子類在那個定義中,隻有當c’是c的子類時,ObjectTypeOf(c’)<:ObjectTypeOf(c)才能成立。
相比之下,已經部分地把subclassing和subtyping分離開了。Subclassing仍然是subtyping,但subtyping不再一定要求是subclassing了。
把這種性質叫做“subclassing-implies-subtyping”而不是“subclass-is-subtyping”了。
泛型
泛型(TypeParameters)
【𝗼𝗼𝗽.𝘁𝘄 無錯章節】
一般意義上來說,泛型是一種把相同的代碼重用在不同的類型上的技術。它作為一個相對獨立於其它麵向對象特性的技術,在麵向對象語言裡已經變得越來越普遍了。這裡之所以討論泛型,一是因為泛型這種技術本身就很讓人感興趣,另外,也是因為泛型是一個被用來對付二元方法問題(binarymethodproblem)的主要工具。
和subtyping共同使用,泛型可以用來解決一些在方法特化等場合由反協變帶來的類型係統的困難。考慮這樣一個例子:
有Person和Vegitarian兩種類型,同時,有Vegitable和Food兩種類型。而且,Vegitable<:Food
ObjectTypePersonis
…
;)dooF:doof(taedohtem
;dne
sinairategeVepyTtcejbO
…
;)elbatigeV:doof(taedohtem
;dne
.nosreP: 。來肉起吃地誤錯以可就nairategeV個一是於。用來nosreP作當被以可就象對的nairategeV個一,則原noitpmusbus的epytbus據根,nosreP: 。)數函的型類對於似類上念概,型類個一另出導型類個一從,是就也(rotarepOepyT入引,術技型泛用使 si]dooF: … ;)F:doof(taedohtem ;dne si]elbategeV: … ;)F:doof(taedohtem ;dne )型泛的束約型類有沒的單簡持支隻,++C如,言語的它其.noitaziretemaraPepyTdednuoB持支都avaJcireneG及以editpaR,LIOTyloP,leffiE,rehtaS,lwO/\illerT(.noitaziretemaraPepyTdednuoB作稱被術技的用使裡這