![]() ![]() |
総称と継承という、クラスを一般化するための二つの基礎的な機構は、二つの実り多い方法を結合することもできます。
最初の技法は、多態的なデータ構造 をもたらします。総称クラス LIST[G]において、挿入手続き put は、挿入されるべき要素を表している、型 G の形式引数をもつと仮定してください。そして、次のような宣言を用いるとします。
型規則は、pl.put ("...")という呼出しにおいて、その引数が型 POLYGON だけでなく、型 RECTANGLE ( POLYGON の継承者)、あるいは継承を通じて POLYGON に適合<comform>する他のどんな型のものでもある、ということを暗に意味しています。
ここで使用された適合<comformance>の要件は、継承に基づく型の互換規則です。単純な場合には、V は、もし V が T の子孫であるならば、その時に限って、T へ適合します。
pl といった構造は、異なる型のオブジェクト、それゆえに、名前 "多態的なデータ構造" を包含してもかまいません。もう一度、このような多態性は、型規則によって、継承グラフ内でより高位またはより低位のものに基づく実総称パラメータ(例では POLYGON )を選ぶことによって、安全にさせます。あなたは、pl 内のオブジェクトの許される型を拡張または制限します。完全に一般的なリストは、次のように宣言されるでしょう。
ここで、カーネル ライブラリのクラスである ANY は、自動的に、あなたが書くかもしれないどんなクラスでも、その祖先になります。
総称と継承を結合するための他の機構は、制約された総称です。次のように、形式総称パラメータの後にクラス名を示すことによります。
あなたは、そのクラス(ここでは ADDABLE )の子孫だけは、対応する実総称パラメータとして使用してもよい、ということを表現しています。このことは、対応する操作を使用することを可能にさせます。たとえば、ここで、クラス VECTOR は、ベクトルの要素を追加するための ADDABLE からの対応するルーチンに基づいて、ベクトルを追加するためのルーチン infix "+" を定義することもできます。それから、VECTOR 自体を ADDABLE から継承させることによって、あなたは、それ自体の総称的な制約を満足させ、VECTOR [VECTOR [T ]] といった型の定義を可能にする、ということを保証します。
おそらく、あなたがお思いになったように、LIST [G ] におけるような、制約されていない総称は、次にあるように、ANY によって制約された総称のための省略と見なすこともできます。
![]()
URL
for this page: http://www.eiffel.com/doc/manuals/language/intro/geninh.maker.html.
Copyright 1994-1998 Interactive Software Engineering Inc. All rights reserved.