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


31

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



7
Jodrellのコメントは単に間違っています。インターフェースの実装は確かに継承であり、あるインターフェースを別のインターフェースから継承することは継承です。どうやって知るの?使用している単語を定義します。継承とは、あるタイプの継承可能なメンバーが別のタイプのメンバーでもあるというプロパティです。この定義により、インターフェイスを実装するクラスは、インターフェイスのすべてのメソッドを継承しています。クラスとインターフェースを見ると、正しいプログラムで同じメンバーがいることがわかります。
エリックリッパー

私はチェックを外し、より多くの混乱を残しました。
ラジーブVenkatさん

18
それが価値があるものとして、あなたはあなたに多くの利益をもたらさない単語定義に多くの時間を費やしていると思う。結局のところ、インターフェイスの実装が何を意味するのか、そしてそれが「継承」と見なされるかどうかは、日々の作業にとってほとんど重要ではありません。
ロバートハーヴェイ

3
私は(ほとんど)ロバートに同意します。さまざまな文脈で使用されている専門用語の正確な技術的意味を理解することには、真の価値があると思います。しかし、ロバートは、実際の影響を理解することの方がはるかに大きなメリットがあることは正しいです!継承を使用してコードをより安全にするにはどうすればよいですか?よりテスト可能ですか?より再利用可能ですか?より柔軟ですか?等々。基本型のメンバーが派生型のメンバーでもあることを知ることは素晴らしいことですが、それを効果的に使用する方法を知ることはなお良いです。
エリックリッパー

回答:


78

更新:この回答を修正しました。コメントを求めるに値する多くの良い点が挙げられました。

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

「継承に従う」とはどういう意味かは完全には明らかではありません。少し違う質問をしてみましょうか?

継承とは何ですか?

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

これらは微妙に異なります。紛らわしいので残念です。

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

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

この混乱を避けるために、JavaとC#の仕様で「継承」以外の言葉を使用してインターフェイスメソッドとクラスの関係を説明していただければ幸いです。しかし、彼らはそうではない、と我々は理由を持っているから仕様ではなく、反対にそれら。

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

はい、いくつかあります。Java仕様セクション8.4.8を参照してください。これは、便宜上、ここで引用しています。

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

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

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

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

この微妙な区別は日常業務で重要ですか?

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


4
正規の参照について議論することはできません。仕様が異なる場合、必然的にそうであるように、単純な用語は意味的にオーバーロードされ、文脈から曖昧になります。質問がでタグ付けされたjavaOPは、他のいくつかの意味がない限り、これが正しい答えであるようjava:-)
Jodrell

5
質問にはJavaのタグが付けられていますが、一般的な用語の言語仕様を引用するのは問題があります。多くの言語にはインターフェースがあり、その言語仕様は異なる用語を使用する場合があるため、X-Langを使用する開発者と話すときには、Java固有の用語を使用すると混乱する場合があります。
トーマスオーエンズ

5
@ThomasOwens:このシナリオは一般的であり、あなたの結論に完全に同意しないことに同意します。あなたが説明するコミュニケーション問題の解決策は、関連する文脈の言葉の正確な意味に関して関係者全員を教育することです。この明確さを提供する仕様が存在します。それらを使用してください!
エリックリッパー

5
ここでJava言語仕様が最終決定権を得るのはなぜですか?言語仕様では、用語について「共通の開発者」が同意しないことをしばしば主張しています。
ベンジャミングリュンバウム

5
@BenjaminGruenbaum:知らないで。それらの開発者は間違っており、彼らはしばしば自分自身に間違った信念について他の人を「教育」するためにそれを引き受けます。著者がVB、C#、JavaScriptなどについて完全に狂った信念を持っていたので、私が修正しなければならなかったプログラミング言語の本の数は、決して間違っていたとは思わないでしょう。(ジョンスキートはその中にいませんでした; C#In Depthは最初から正しかったです!本にこれほど少数のコメントを書いたことがなく、まだ支払われました。)
エリックリッパー

26

継承とは、スーパークラスの新しいサブクラスを作成することです。インターフェイスに対して新しいクラスを作成すると、そのインターフェイスが実装されます。(古いインターフェースに基づいて新しいインターフェースを作成すると、そのインターフェースが拡張されます。)

3つすべての可能性に適用される唯一の正しい用語は、サブタイピングです。すべてのサブタイプがサブクラスではありません。


1
GoFの本では、サブタイプ(セクション1.6クラスとインターフェイスの継承)を説明するために、インターフェイスの継承に適切な用語を検討しているようです
-gnat

「ジェームズゴスリング(Javaの発明者)が主演スピーカーであるJavaユーザーグループ会議に参加したことがあります。思い出に残るQ&Aセッション中に、誰かが彼に尋ねました。実際の問題はクラスそのものではなく、実装の継承(拡張関係)であると説明しました。インターフェースの継承(実装関係)が望ましいです。可能な限り実装の継承を避ける必要があります。」javaworld.com/article/2073649/core-java/...
ricardoramos

1

サブクラス、あなた

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

インタフェースには、契約によって気力実装宣言されたメソッドを。

それが古典的な見方です。今でのJava 8のインターフェイスは、混合物になります。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.