Eiffel Tutorial : 7 Genericity and Arrays
Eiffel Tutorial の 7 章.総称と配列の説明.
他のオブジェクトを特定のデータ構造で格納する目的で利用されるクラス,いわゆるコンテナクラスってのはとてもよく使われるし重要なんだ.これを高い拡張性と高い再利用性,それに高い信頼性をもって実現するには総称(genericity)を使って実現するのがいいんだぜ!という話.
Meyer 先生が「だぜ!」とか言うのかは知らないけど.
Making a class generic
総称クラスの作り方.
class C [G] feature first: G -- Value of first list item extend (val: G) is -- Add a new item of value val at end of list
こんな感じ.ここで G は形式総称パラメータ(formal generic parameter) でクラス内の型宣言で利用できます.これは総称クラスから型を作るときに指定された実総称パラメータ(actual generic parameter)で置き変えられます.つまり以下のように宣言すると属性 first やルーチン extend の引数は INTEGER 型になるということ.
c : C [INTEGER]
あとは普通なので略.
Arrays
配列は特別なものじゃなくて単なる総称クラス ARRAY で実現されます.
- 手続き my_array.put(val, 25) で 25 番目の要素を val で置き換え
- 関数 my_array.item(25) で 25 番目の要素を取得
- item の別名として infix "@" が設定されてるので my_array @ 25 でもOK
- ちょっと試した限りでは "[]" も別名で C 風に my_array[25] でもOKの模様
でも ARRAY はオブジェクトで infix "@" も "[]" も関数なので以下のように代入はできません.当然.
my_array @ 25 = val my_array[25] = val
C の配列と全く別ものだと区別するためとかそういう理由で infix "@" の方が推奨なのでしょう.たぶん…
Generic derivation
総称クラスの考え方を導入するとクラスと型とは違うものになるよって話.つまり総称クラスは型ではなくて実総称パラメータが渡されてようやく型になるということ. Eiffel の意味論はそうらしい.
総称クラスから型を得ることを総称的派生(generic derivation)といって派生した型を総称的に派生した型(generically derived type)という.訳語超嘘っぽいけどまあいいや.