rename と redefine
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/15 09:32 UTC 版)
「Eiffel」の記事における「rename と redefine」の解説
Eiffel の特徴の一つとして、継承における細かい指定が可能ということが挙げられる。例えば class A feature method1 is io.put_string("Hello from A") io.new_line end end class B inherit A feature method1 is io.put_string("Hello from B") io.new_line end end というコードがあるとする(ioは標準入出力を扱うインスタンスで、ANYクラスのメンバである)。これは A というクラスを継承した B というクラスに同じ名前のメソッドがある場合である。このとき class C creation make feature a : A b : B make is do !!b a := b b.method1 a.method1 end end というコードを実行したとき。b.method1 はおそらく B で定義されたメソッドが動くと誰もが期待するだろうが、a.method1 で実行されるメソッドは A と B どちらで定義されたものだろうか?この場合の処理は言語によって異なっており例えばC++の場合は A で定義されたメソッドが実行され、Javaの場合は B のメソッドが実行される。すなわち言語によって動作が違うため作成者の勘違いなどによって混乱を招くおそれがある。 Eiffelでは実のところ、どちらが実行されるか以前に上記のような例ではコンパイルすることができないことになっている。すなわち Eiffelのメソッドは全てデフォルトでは継承不可である。しかしこれでは、あまりに制約が強すぎるため、同名のメソッドを定義する必要性があるときは、継承クラスの作成者がどちらを実行するかを指定することが出来る。 具体的には rename と redefine という機能があり、上記の例では A で定義されたメソッドを実行したい場合は class B inherit A rename method1 as method2 end とする。この場合クラス B では A のメソッドを method2 という名前に改名させて、名前の衝突を防いでいる。B のインスタンスでも、クラス A のインスタンスとして扱われた場合(上記の例のような場合)は A の method1 が実行され、クラス B のインスタンスとして扱われた場合は B のmethod1 が実行される。B のインスタンスとして扱われた状態で A の method1 を実行するには上記の例では b.method2 とすればよい。これらの改名による効果は継承先と継承元の他、多重継承時のメソッド同士の衝突にも使用できる。 逆に A のインスタンスとして扱われる場合でも B の method1 を実行したい場合は以下のようにする。 class B inherit A redefine method1 end この場合、クラス B はクラス A の method1 を継承時に破棄しクラス B で再定義することを示している。クラス B のインスタンスは A、B どちらで扱われても method1 はクラス B のものが実行され、クラス A の method1 はもはや実行されることは無い。なお再定義を宣言された method1 は必ずクラス B で再定義しなければならず、再定義していない場合はコンパイルエラーとなる。 このように、Eiffel ではクラスの継承時に継承クラスの作成者がメソッドの扱いを自由に設定することができる。
※この「rename と redefine」の解説は、「Eiffel」の解説の一部です。
「rename と redefine」を含む「Eiffel」の記事については、「Eiffel」の概要を参照ください。
- rename と redefineのページへのリンク