// 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. メリット:
- インターフェイスの実装とクラスの継承を同時に使用することで、異なるクラス間でのコードの共有と再利用が容易になります。
- クラスが複数の側面を持ち、それぞれの側面が異なるクラス階層で階層化されるような柔軟で再利用可能な設計が可能です。
このような設計の柔軟性は、特に大規模で複雑なアプリケーションの開発やメンテナンスにおいて重要です。