読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

interfaceと抽象クラスの本質的な違いを勘違いしていた。

ずっと勘違いをしていた。

でもこの記事読んで、すごいすっきりわかった。

若干古い記事だけど、こういう良記事がWeb上に掲載されて永く残るのはいいなぁ。

結論から言えば、両者の使い分けは次のようになります。まず、インタフェースは、主に継承階層の異なる複数の型をオブジェクトに持たせるために使います。一方の抽象クラスは、主に同一の継承階層に属するクラスに共通する処理を持ったスーパークラス(基底クラス)として定義します。
(中略)
「型の継承」、「実装の継承」
 上述したように、言語仕様の観点から共通点と相違点を挙げると、両者の使い分けは、例えば「クラスでは多重継承ができないので、多重継承をするときには抽象クラスではなく、インタフェースを使う」とか、「インタフェースでは実装を定義できないので、実装の継承が必要であれば抽象クラスを使う」といった認識になりがちです。
 しかし、これでは本末転倒です。そうではなく、インタフェースと抽象クラスがなぜこのような仕様になっているのかという理由を理解したうえで使い分けることが重要です。
(中略)
 Javaにおけるインタフェースは、クラスとは異なり、「型」だけを定義できるメカニズムだと考えてよいでしょう。
(中略)
 一方、実装の継承を有効に利用できるのが抽象クラスです。
(中略)
このように、抽象クラスは処理の一部、あるいは処理の骨組みを共通化し、再利用するために利用できます。ただし、抽象クラスを用いる場合でも、「正当な型継承」を行うということが前提として存在し、実装の再利用のためだけに継承を使うのは誤りであることを理解してください。

なーるほーどねー。
やっぱ普段Javaやってるわけじゃないから、こういう概念が理解できてないこと多いなぁ。