- 締切済み
Javaの実装方法?Eclipse?ポリモルフィズム?
Javaの実装方法はどうなのかの質問です。 Eclipseで解析しているのですが、解析は「宣言を開く」(F3)で進みながら解析しています。 以下のソースだと、yobidasiクラスのMethodXからMethodAにF3で飛ぶとOyaClassのMethodAにきます。 その後、MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます。 でも、実際の動きは、OyaClassではなくkoClassのMethodBに行きます。 この実装方法ってどうなのでしょうか?こういうものなのですか? 解析ミスに繋がらないかなと思っているんですが。 また、EclipseでkoClassに飛ばす方法はあるんでしょうか? 助言をください。 class yobidasi{ methodX{ koClass cls = new koClass; cls = methodA } } public class koClass extends OyaClass{ protected methodB{ } } public class OyaClass { public methodA{ methodB() } protected methodB{ //空メソッド } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- bleis
- ベストアンサー率68% (11/16)
> OyaClassだけを見たとき、OyaClass内のMethodBに飛ぶと思って対応をおこなったけど、 > 実は、KoClass呼び出しでKoClassのMethodBにジャンプすることになっていた。なんて問題がおきそうな気がするのですが。 確かに、何も考えずに設計してしまうとそういう問題にはまることはありえます。 ただし、もちろんそうならないような努力も可能です。 リスコフの置換原則というのもその1つです。 デザインパターンなどを学ぶのもいいと思います。 > また、koClassがたくさんあったり、koClassのKoClassがあったりしたら 1つのクラスから大量の派生クラスが存在するのは、おそらく良くない設計の可能性が高いです。 そもそも、継承は本当に必要なとき以外には使うべきではありません。 > Eclipseの宣言を開く 宣言を開くではなく、クイック階層を使います。
とりあえず、コードを挙げるなら、まともに動くものをあげて欲しい。まともに動くようにするのに手間がかかると読む気がしなくなる。 まず、「MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます」これは正しい反応。なぜなら、メソッドを検索するときは、まずそのクラス内にあるものを検索し実行するのだから。 「実際の動きは、OyaClassではなくkoClassのMethodBに行きます」というのは、間違いではないが、おそらく頭の中で勘違いをしていると思う。なぜkoClassのMethodBにいくかといえば、そのインスタンスがOyaClassではなくkoClassだから。koClassのインスタンス内のメソッドで呼び出せば、同じkoClassにあるメソッドが呼び出されるのは当たり前。methodXでインスタンスを作っているが、 koClass cls = new koClass(); ↓ OyaClass cls = new OyaClass(); こう書き換えて試してみれば、今度はOyaClassのメソッドが使われるようになっているはず。
お礼
ありがとうございます。 koClassのインスタンスを作っているのでkoClassのMethodBが呼ばれるのはわかります。 わからないのは、 ・この実装方法は普通なのか? OyaClassだけを見たとき、OyaClass内のMethodBに飛ぶと思って対応をおこなったけど、 実は、KoClass呼び出しでKoClassのMethodBにジャンプすることになっていた。なんて問題がおきそうな気がするのですが。 また、koClassがたくさんあったり、koClassのKoClassがあったりしたら、解析するにも1個1個のメソッドで全部子クラス洗いだして 大規模なソースを解析する場合、とてつもない作業になる気がするのですが、どうなのでしょう。 ・Eclipseの宣言を開く この場合Yobidashiからジャンプしたことを覚えておいて、OyaClassのMethodAからKoClassのMethodBに飛べるようにはできないんでしょうか コンパイルの通るソースに書き直しました。 --MainClass-- package hoge; import hoge.Yobidashi; public class MainClass { public static void main(String[] args) { Yobidashi yobi = new Yobidashi(); yobi.methodX(); } --YobidashiClass-- package hoge; import hoge.KoClass; public class Yobidashi { public void methodX(){ KoClass cls = new KoClass(); cls.methodA(); } } --KoClass-- package hoge; public class KoClass extends OyaClass { public void methodB(){ System.out.println("KoClass MethodB"); } } --OyaClass-- package hoge; public class OyaClass { public void methodA(){ System.out.println("OyaClass MethodA"); methodB(); } public void methodB(){ System.out.println("OyaClass MethodB"); } }