インターフェースの必要性についてJavaを使って解説(2)
2017/04/04
第一回目はこちら。読んでいない方はまず最初に読んでください。
前回までの問題は、ユーザー側のクラスで定義したメソッドを、受け取り側で使えないことについて書きました。ユーザーのクラス名はわからないので、継承した上位クラスで受け取らなければならないためです。
さて、どうやったら、ユーザーが実装したメソッドを使えるのでしょうか?
その答えはインターフェースにあるのですが、今回はちょっと遠回りして別の解決策を述べたいと思います。
但し、いずれもJavaでは不可能なやり方です。インターフェースをより理解してもらうために、「もし、Javaでこんな機能があったら」という想定で話をします。
[ad#top-1]
方法1:上位クラスにあらかじめ使う予定のメソッドを用意しておく
上位クラスのメソッドしか使えないのなら、あらかじめ上位クラスに使うであろうメソッドを用意しておくという方法です。最上位のObjectに特に機能を持たない(空っぽの)複数のメソッドを用意しておけば、使いたいものだけオーバーライドすれば良いわけです。
こうすれば、上位クラスで受け取っても、さらにその上のクラスで定義したメソッドを呼び出すことができるわけです。
しかし、この方法は現実的ではありませんね。
Javaユーザーがどれだけのメソッドを使うか、または互いに干渉しないか、などを考えれば、膨大なメソッド数を用意しておかなければなりません。
理論上は可能でもどこかで破綻します。
方法2:多重継承を認める
Javaでは多重継承を認められていませんが、もし認められれば今回の問題は解決できます。
もともとユーザー側のクラスがJFrameを継承していたとしても、同時にhogeメソッドを持つクラス(例えばHogeクラスとしましょうか)も継承すれば、Hogeで受け取れば、hogeメソッドをコールできるわけです。
Hogeクラスを自作して、hogeメソッドを定義しておきます。もちろん中身は空っぽでOKです。ユーザー側が多重継承して、ユーザー側で実装すればよいのですから。
このようにすれば、あなたの作るMyDialogクラスはユーザー側のクラス名を知ることなく、
owner.hoge(textbox.Text);
とhogeメソッドにテキストボックスの中身を投げられるわけですね。
まあ、ただご承知の通りJavaでは多重継承ができません。でもここまで見て何か思い当たる節はないでしょうか?
Hogeクラスはあくまでhogeメソッドを使わせるために作ったクラスです。Hogeクラス内のhogeメソッドは空っぽでも構いません。hogeメソッドはユーザー側で実装するのですから。
もうこれはJavaのインターフェースそのものですね。
次回が最終回です。
.
[ad#ad-1]
スポンサーリンク