質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

882閲覧

オブジェクト指向に基づいた実装に関して

Hanbe.T

総合スコア36

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/12/03 15:39

編集2018/12/04 15:54

元々以下のソースコードがあるのですが、Test1クラスのmethodAの引数を修正する必要があります。
その場合、2通りの修正を思いついたのですが、どちらが正しいのかが判断つかずにいます。

Javaの経験はそれなりにあるのですが、これほどオブジェクト指向にそった実装を業務では初めて見たので、戸惑っております。

修正案1では、目的は同じだが、内容が異なるだけで、インターフェースを増やしてしまうのは、オブジェクト指向からずれているような気がしています。

修正案2では、オーバーロードすることにより、インターフェースが増えないため、無駄な実装をしなくて済むと考えているのですが、オーバーロードによって引数を減らすというソースをあまり見たことがないので、違和感があります。

修正案1、2の理由付け、または第3案を出していただいても構いません。
お手数ですが、アドバイスのほど、よろしくお願いいたします。

  • 元のソースコード

Java

1// TestIF.java 2public interface TestIF { 3 String methodA(String str1); 4} 5 6// TestAbs.java 7public class TestAbs implements TestIF { 8 @Override 9 public String methodA(String str1) { 10 return "Abs:" + str1; 11 } 12 // 他にも具象メソッドが存在する。 13} 14 15// Test1.java 16public class Test1 extends TestAbs { 17 public String methodA(String str1) { 18 return "Test1:" + str1; 19 } 20 // ↓ 修正後のメソッド(上記のメソッドは不要になる) 21 public String methodA(String str1, String str2) { 22 return "Test1:" + str1 + "/" + str2; 23 } 24} 25 26// Test2.java 27public class Test2 extends TestAbs { 28 public String methodA(String str1) { 29 return "Test2:" + str1; 30 } 31} 32 33// MainTest.java 34public class MainTest { 35 public void init(String str1) { 36 switch(str1) { 37 case "1": 38 Test1 t1 = new Test1(); 39 mainLogic((TestAbs) t1); 40 break; 41 42 case "2": 43 // 誤り 44 //Test1 t2 = new Test1(); 45 Test2 t2 = new Test2(); 46 mainLogic((TestAbs) t2); 47 break; 48 49 default: 50 break; 51 } 52 } 53 54 private void mainLogic(TestAbs abs) { 55 System.out.println(abs.methodA("str1")); 56 } 57 // ↓ 修正後のメソッド(上記のメソッドは不要になる) 58 public String mainLogic(TestAbs abs) { 59 System.out.println(abs.methodA("str1", "str2")); 60 } 61}
  • 修正案1
  1. インターフェースに新しい抽象メソッドを定義する。
  2. 抽象クラスに新しく追加したメソッドを実装する。
  3. Test1クラス、Test2クラスでそれぞれ必要なメソッドをオーバーライドする。

Java

1// TestIF.java 2public interface TestIF { 3 String methodA(String str1); 4 String methodA(String str1, String str2); 5} 6 7// TestAbs.java 8public class TestAbs implements TestIF { 9 @Override 10 public String methodA(String str1) { 11 return "Abs:" + str1; 12 } 13 14 @Override 15 public String methodA(String str1, String str2) { 16 return "Abs:" + str1 + str2; 17 } 18} 19 20// Test1.java 21public class Test1 extends TestAbs { 22 public String methodA(String str1, String str2) { 23 return "Test1:" + str1 + "/" + str2; 24 } 25} 26 27// Test2.java 28// 修正なし
  • 修正案2
  1. インターフェースの抽象メソッドを修正する。
  2. Test1クラスのメソッドを修正する。
  3. Test2クラスのmethodAをオーバーロードする。

Java

1// TestIF.java 2public interface TestIF { 3 String methodA(String str1, String str2); 4} 5 6// Test1.java 7public class Test1 extends TestAbs { 8 public String methodA(String str1, String str2) { 9 return "Test1:" + str1 + "/" + str2; 10 } 11} 12 13// Test2.java 14public class Test2 extends TestAbs { 15 public String methodA(String str1, String str2) { 16 methodA(str1); 17 } 18 19 public String methodA(String str1) { 20 return "Test2:" + str1; 21 } 22}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言うと、

java

1// Test1.java 2public class Test1 { 3 public String methodA(String str1, String str2) { 4 return "Test1:" + str1 + "/" + str2; 5 } 6} 7 8// Test2.java 9public class Test2 { 10 public String methodA(String str1) { 11 return "Test2:" + str1; 12 } 13}

これで十分だと思います。

Test1とTest2の2つのオブジェクトのメソッドで引数の数が違い、役割が全く違うので、インタフェースを使って多態性を持たせること自体に無理があるように思います。

JDKの中でも、FunctionBifunctionは引数の個数が同じでやってることは大差ないのですが、2つのインタフェースに分けてあります。

投稿2018/12/03 16:16

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hanbe.T

2018/12/04 15:53

早速のご回答ありがとうございます。 まず、元のソースコードが間違っていたため、修正いたしました。 MainTestクラスのswitch文内のcase "2"の分岐で使用しているクラスが間違っていました。 次に、TestAbsクラスなのですが、実際には他にも具象メソッドが存在し、クラスそのものをなくすことはできません(修正の規模が大きくなりすぎてしまうため) >引数の数が違い、役割が全く違うので、インタフェースを使って多態性を持たせること自体に無理 ご指摘いただいた通り、インターフェースを用意する意味を考えると、特例に対して新しいインターフェースを用意するのは、よくないのですね。 提示した情報に不足、誤りがあり、大変申し訳ありませんでした。 上記踏まえたうえで、再度ご回答いただければ、幸いです。
swordone

2018/12/04 16:13

新しいインタフェースを用意することは問題ありません(私が例に出したFunctionとBiFunctionのように) 役割の違うものに、「同じインタフェースを実装する」のが無理なのです。
Hanbe.T

2018/12/05 14:04

失礼いたしました。 指摘の内容を理解できていませんでした。 いただきましたアドバイスを参考に修正していきたいと思います。 迅速な解答をしていただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問