犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

名前と引数が同じだが無関係なメソッドのオーバーライド

2013-05-26 12:01:04 | Weblog

● 概要

JDK 1.5以降で導入された共変戻り値型によって、名前と引数が同じだが無関係なメソッドのオーバーライドが可能になっている。

 

● 状況

共変戻り値型が使える場合、図のようなオーバーライドが可能である。

前提は

+ あるインターフェイス(図ではInterfaceX)が、自身を戻り値型とするメソッド(図ではmethod(...): InterfaceX)を持つ。

+ あるインターフェイスないしクラス(図ではSuperclassA)が、自身を戻り値型とするメソッド(図ではmethod(...): SuperclassA)を持つ。

+ これらのメソッドmethod(...)は、名前と引数(その数と型と並び順)が一致する。
 
さらに、SuperclassAがInterfaceXを継承もしくは実装しているなら、SuperclassAを継承したクラスのメソッドmethod(...)は自動的に、InterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassAの両方をオーバーライドしたものになる。
 
一方、SuperclassAがInterfaceXを継承・実装しておらず無関係な場合、SuperclassAを継承したクラス(図ではClassB)がInterfaceXを実装しようとすると、2つのメソッドmethod(...)の戻り値型が整合せず、コンパイルできない。
 
この状況で、ClassBがメソッドmethod(...)を共変戻り値型によりmethod(...): ClassBとしてオーバーライドすれば、これはInterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassAの両方をオーバーライドしたものになる。
 
つまり、名前と引数が同じだが無関係なメソッドのオーバーライドが可能である。
 
 
※ この方法に名前はある?
※ この方法と関係するデザインパターンはある?
※ この方法を使って無関係な2つのメソッド(InterfaceX#method(...): InterfaceXとSuperclassA#method(...):SuperclassA)に共通の実装を与えるのが妥当な状況があるとして、これらの2つのメソッドに予め関係を与えておくことはできる?そこに意味はある?