017 インターフェイス(実装と継承) 006 解答例

// Runnable インターフェイスの宣言
interface Runnable {
    void run();
}

// Animal クラスの宣言と Runnable インターフェイスの実装
public class Animal implements Runnable {
    // makeSound メソッドの宣言
    void makeSound() {
        // 適切な実装
    }

    // run メソッドの実装 (Runnable インターフェイスの実装)
    @Override
    public void run() {
        // 適切な実装
    }
}

// Dog クラスの宣言と Animal クラスの継承
public class Dog extends Animal {
    // makeSound メソッドのオーバーライド
    @Override
    void makeSound() {
        System.out.println("Woof!");
    }

    // run メソッドの実装 (Runnable インターフェイスの実装)
    @Override
    public void run() {
        System.out.println("Running like a dog.");
    }
}

この例では、Animal クラスが Runnable インターフェイスを実装し、Dog クラスが Animal クラスを継承しています。また、Dog クラスは makeSound メソッドをオーバーライドし、「Woof!」と表示します。run メソッドも Runnable インターフェイスの実装に従い、「Running like a dog.」と表示します。

インターフェイスの実装とクラスの継承の同時利用

柔軟なクラス設計:

  • インターフェイスの実装とクラスの継承を同時に利用することで、クラスは異なる側面や振る舞いを持つことができます。
  • 例えば、動物(Animal)クラスが鳴くことと同時に走ることができるようにしたい場合、インターフェイスの実装とクラスの継承を組み合わせることが有益です。

2. 具象クラスとインターフェイス:

  • 具象クラスはインターフェイスを実装し、同時に他のクラスを継承することができます。
  • 具象クラスは、継承によって既存のクラスの機能を取り入れつつ、インターフェイスの実装によって新しい振る舞いや契約を持つことができます。

3. 例:

interface Runnable {
    void run();
}

class Animal {
    void makeSound() {
        System.out.println("Generic animal sound");
    }
}

class Dog extends Animal implements Runnable {
    @Override
    void makeSound() {
        System.out.println("Woof!");
    }

    @Override
    public void run() {
        System.out.println("Running like a dog.");
    }
}
  • Animal クラスは makeSound メソッドを持つが、Dog クラスはこれをオーバーライドして独自の「Woof!」という鳴き声に変更しています。
  • 同時に Dog クラスは Runnable インターフェイスを実装し、run メソッドを追加しています。これにより、Dog クラスは Animal クラスの特性を持ちつつ、Runnable インターフェイスの要件を満たすことができます。

4. メリット:

  • インターフェイスの実装とクラスの継承を同時に使用することで、異なるクラス間でのコードの共有と再利用が容易になります。
  • クラスが複数の側面を持ち、それぞれの側面が異なるクラス階層で階層化されるような柔軟で再利用可能な設計が可能です。

このような設計の柔軟性は、特に大規模で複雑なアプリケーションの開発やメンテナンスにおいて重要です。

「017 インターフェイス」問題集リスト