元々以下のソースコードがあるのですが、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
- インターフェースに新しい抽象メソッドを定義する。
- 抽象クラスに新しく追加したメソッドを実装する。
- 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
- インターフェースの抽象メソッドを修正する。
- Test1クラスのメソッドを修正する。
- 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}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/04 15:53
2018/12/04 16:13
2018/12/05 14:04