DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

7章13

このJavaのコードは、インタフェースと継承の概念を使用しています。ポイントは以下の通りです:

  1. Worker という名前のインターフェイスがあり、これは work という抽象メソッドを持っています。インターフェイスは、具体的な実装を持たないメソッドの宣言を提供する契約のようなものです。

  2. Employee というクラスがあり、このクラスは work メソッドを実装しており、"work" と出力するようになっています。

  3. Engineer というクラスがあり、Employee クラスを継承し(extends)、Worker インターフェイスを実装しています(implements)。EngineerEmployee から work メソッドの実装を継承します。

  4. Main クラスの main メソッドでは、Worker 型の変数 worker が宣言され、新しく作成された Engineer オブジェクトが代入されています。

  5. worker.work(); という行で、worker 変数に割り当てられたオブジェクトの work メソッドが呼び出されます。workerWorker 型ですが、実際には Engineer インスタンスが参照されているため、Employee クラスによって提供される work メソッドの実装が実行されます。つまり、コンソールには "work" が出力されます。

問題の選択肢を見ると、以下の通りです:

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

このコードを分析すると、コンパイルエラーや実行時例外は発生しないため、AとBとDは不正確です。Engineer オブジェクトを通じて work メソッドが呼び出されると "work" がコンソールに出力されるので、答えは C です。

// Workerというインターフェイスを定義します。
// これは、実装するすべてのクラスに対して、workというメソッドの実装を強制します。
interface Worker {
    void work(); // workメソッドのシグネチャ。実装は提供されていません。
}

// Employeeクラスを定義します。
// このクラスは、workメソッドを持っており、何か作業をすることを示すメッセージを出力します。
class Employee {
    public void work() { // workメソッドを実装します。
        System.out.println("work"); // コンソールに"work"と出力します。
    }
}

// Engineerクラスを定義します。
// このクラスはEmployeeクラスを継承し(extends)、
// Workerインターフェイスを実装します(implements)。
// ただし、EngineerはEmployeeからworkメソッドを継承するので、
// 明示的なメソッド実装を提供する必要はありません。
class Engineer extends Employee implements Worker {
    // ここでは何も追加しなくても、Employeeクラスからworkメソッドを継承します。
}

// Mainクラスを定義します。
public class Main {
    public static void main(String[] args) {
        // Workerインターフェイスを実装するEngineerオブジェクトを作成し、
        // Worker型の変数workerに割り当てます。
        Worker worker = new Engineer();

        // workerのworkメソッドを呼び出します。
        // 実際にはEngineer(Employeeから継承した)のworkメソッドが実行され、
        // "work"とコンソールに出力されます。
        worker.work();
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードは、オブジェクト指向プログラミングのポリモーフィズムを示しています。Worker インターフェイスの参照を通して、Employee クラスの work メソッドを呼び出すことができます。これは、Engineer オブジェクトが Worker インターフェイスの work メソッド契約を満たすためです。これにより、プログラムはより柔軟で、拡張性が高くなります。

Top comments (0)