web-dev-qa-db-ja.com

インターフェイスを実装すると、それは継承と呼ばれますか?

クラスimplementsがインターフェイスの場合、継承をフォローしていると言えますか?クラスがextends別のクラスである場合、それは継承であることを知っています。

33
RajeeV VenkaT

更新:私はこの答えを修正しました。呼びかけに値するコメントで多くの良い点が提起されました。

私のクラスがインターフェイスを実装している場合、継承に従っていると言えますか?

「継承に従う」が何を意味するのかは完全には明らかではありません。少し違う質問をしましょうか?

継承とは?

  • 1つのタイプXのメンバーが別のタイプYのメンバーであると見なされる場合、YのメンバーはXから継承されます。
  • いくつかのタイプの間には継承関係があります。つまり、一部のタイプXおよびYについて、「YはXから継承する」と言います。

これらは微妙に異なります。混乱するので残念です。

この微妙な違いから、通常どのような混乱が生じますか?

人々は継承を実装の詳細を共有するためのメカニズムとして考えるため、混乱が生じる可能性があります。このメカニズムはですがこのようなメカニズムですが、そのメカニズムはmembersを共有することで機能します。これらのメンバーは実装する必要はありません!後で見るように、それらは抽象的である場合があります。

JavaおよびC#の仕様で「継承」以外の単語を使用して、インターフェイスのメソッドとクラスの関係を記述し、この混乱を回避した方がいいと思います。しかし、そうではなく、 from仕様ではなく、against仕様ではない。

Javaでは、インターフェースメンバーはそれらを実装するクラスによって継承されますか?

はい、そうです。 Java仕様セクション8.4.8を参照してください。これは、参考のためにここで引用します。

クラスCは、その直接のスーパークラスと直接のスーパーインターフェイスから、次のすべてが当てはまるすべての抽象メソッドとデフォルトメソッドmを継承します。[...]

クラスがインターフェースを実装すると言った場合、クラスはそのインターフェースの抽象メソッドとデフォルトメソッドを継承します。 (もちろん、以下の条件は省略しています。詳細は仕様を参照してください。特に、インターフェイスのメンバーを実装するクラスはnotと見なされますそのメンバーを継承したことです。繰り返しますが、これは混乱しますか?はい。)

通常、Javaで、クラスがインターフェースから継承すると言いますか?

通常、クラスはインターフェースを実装すると言います。上記のように、クラスはインターフェイスからmembersを継承する場合がありますが、それでもインターフェイスから継承するとは言えません。はい、わかりにくいです。

この微妙な違いは、日常の仕事では重要ですか?

通常はありません。仕様のこの種の狭い解析は、基幹業務の開発者よりもコンパイラの作成者にとって有用です。 「継承元」の正確な定義を取得することよりも、いつインターフェースを使用するかを理解することが重要です。

78
Eric Lippert

継承は、スーパークラスの新しいサブクラスを書き込むことを意味します。インターフェースに対して新しいクラスを書くことは実装インターフェースです。 (そして古いものに基づいて新しいインターフェースを書くことはextendingそのインターフェースです。)

3つの可能性すべてに当てはまる唯一の正しい用語はsubtypingです。すべてのサブタイプがサブクラスであるとは限りません。

26
Kilian Foth

サブクラスを使用すると、

  • 継承状態スーパークラス(表示されているかどうかにかかわらず、すべてのインスタンス変数)
  • 実際の実装を継承(すべての非抽象メソッド)

interfacesを使用すると、宣言したメソッドをimplementingでコントラクトをフルフィルします。

それが古典的な見方です。 Java 8を使用すると、インターフェースが混合されます。

  • あなたはまだ状態を継承しません(インターフェイスにはまだインスタンス変数がないので)
  • デフォルトの実装を継承インターフェースから

すべてのメソッドにデフォルトの実装があるインターフェースを実装しても、「実装」として、または拡張として数えられますか?わかりませんでした。このケースはかなり先取りされているため(これにより、実際にはステートレスのマルチ継承が有効になります)、「継承」はサブクラスでのみ使用します。

1
Peter Walser