@tt25mrc

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java silver SE17 第5章−13

解決したいこと

以下の問題について質問です。

問題

1. interface Worker {
2.   void work();
3. }
4.
5. class Employee {
6.    public void work() {
7.       System.out.println("work");
8.    }
9. }

1. class Engineer extends Employee implements Worker { }

これらのクラスを利用する以下のプログラムを、コンパイル、実行した時の結果として、正しいものを選びなさい。

1. public class Main {
2.    public static void main (String[] args) {
3.        Worker worker = new Engineer ();
4.        worker. work();
5.    }
6. }

A.Engineerクラスでコンパイルエラーが発生する
B.Mainクラスでコンパイルエラーが発生する
C.「work」と表示される
D.実行時に例外がスローされる

【質問】
5行目のEmployeeクラスが、急に次でinterface Workerをimplementsしているが、5行目の段階でimplementsするべきではないのか?と思いました。
ただ単にClassを定義しているものを、違うところで、implementsしてもいいものなのか疑問に思っています。

質問がよく分からなく、基礎的な部分で申し訳ございません。

0 likes

3Answer

5行目の段階でimplementsするべきではないのか?

EmployeeとWorkerはis-a関係なのでimplementsするべきと思う気持ちは分かりますが、この問題の主題はそこではなくて、extendsとimplementsは同時に出来るよということだと思います。

Workerは自分で作成、EmployeeはAライブラリのクラスで変更不可、こういった状況でEngineerを作りたいというケースではextendsとimplementsは同時に出来るという機能が必要になります。

出題が適切ではないという話になるかもしれませんが、そこは目を瞑るしかないですね。

1Like

Comments

  1. This comment has been deleted for violation of our Terms of Service.

良い質問だと思います。

結論から言うと、問題の範囲外なので判断しかねる、という回答になってしまいます。

どの段階でimplementsするかは設計の話です。「そのシステムが実現する世界を表現するにあたり適切かどうか」という点での判断になると考えています。

ですがこの問題はJavaの仕様としてどうなるか、という問題なのでEngineerWorkerに重要な意味は無いと思います。せいぜい要素の関係として適切、というくらいでしょう。(問題的には「AnimalとDog」のような例でもよい)
ですのでinterfaceをどちらがimplementsすべきか、という疑問に回答できるような意図は含まれていないと思います。

1Like

確かに5行目で実装すればサブクラスが直接インターフェイスを実装する必要はありません
その方が一般的かつ直感的でしょう
ただ、メソッドの定義と実装を分けると言う意味では、悪手とは言い切れません
クラスを継承するということは、そのクラスの性質を強制的に引き継ぐということです
そうした依存性はなるべく削ぎ落とすことが理想とされます
一般的な設計ではありませんが、全くの無駄と言い切ることはできません

1Like

Your answer might help someone💌