1. ホーム
  2. java

Javaインターフェイスは多重継承をどのようにシミュレートするのか?

2023-08-29 08:58:23

質問

Java チュートリアルを読んでいます (2回目)。インターフェイスのセクションを読み終えたところですが、Java インターフェイスが多重継承をどのようにシミュレートするのか、まだ理解できていません。この本に書かれている以上の明確な説明はあるのでしょうか?

どのように解決するのですか?

あなたのドメインにトラックとキッチンの2種類のものがあるとします。

トラックはdriveTo()メソッド、キッチンはcook()メソッドを持っています。

さて、Pauliが宅配トラックの荷台からピザを売ろうと決めたとします。彼はdriveTo()とcook()ができるものが欲しいと思っています。

C++では、彼はこれを行うために多重継承を使用するでしょう。

Javaではそれは危険すぎると考えられたので、メインクラスから継承することができますが、フィールドやメソッドの実装を持たない、どこから見ても抽象的なクラスであるインターフェースから動作を "継承"することができるのです。

そのため、Javaではデリゲーションを使って多重継承を実装することが多いのです。

Pauliはtruckをサブクラス化し、kitchenというメンバ変数でtruckにキッチンを追加しています。彼はkitchen.cook()を呼び出すことで、kitchenインターフェースを実装しています。

class PizzaTruck extends Truck implements Kitchen {
   Kitchen kitchen;

   public void cook(Food foodItem) {
      kitchen.cook(foodItem);
   }
}

のようなことができるようになったので、彼は幸せ者である。

pizzaTruck.driveTo(beach);
pizzaTruck.cook(pizzaWithExtraAnchovies);

OK、このバカげた話は、多重継承のシミュレーションではなく、契約だけを継承できる、インターフェイスと呼ばれる空の抽象ベースクラスからしか継承できないという但し書きのある本当の多重継承であることを指摘するためのものです。

(更新: デフォルトメソッドインターフェース が登場したことで、継承すべき挙動を提供できるようになりました)