...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

interface / abstract class

C++Javaの違いに多重継承ができるできないってのがある。
でもあまり詳しく説明されないので、前から気になっていた。
だから考えてみた。
以下、JavaC++の用語が入り乱れます。すいません(^^;

まず、継承には3種類ある。


・継承
  ・インタフェース継承
  ・実装継承
  ・データ継承

ここで、インタフェース継承とデータ継承は多重継承を許しても問題ないが、
実装継承はダイアモンド継承問題があるので、多重継承は問題があることが重要。
それと、3つの側面のうち複数を同時に持つ継承は後述。


C++の場合。

・インタフェース継承
  スーパークラスとして、フィールドを持たない抽象クラスを用いる。
  多重継承可能。

・実装継承
  スーパークラスとして、サブクラスに実装を上書きさせることを目的としたクラスを用いる。
  多重継承可能なので問題がある。

・データ継承
  スーパークラスとして、フィールドのみを持ったクラスを用いる。
  多重継承可能。

C++では、クラスを特殊化して3つの継承を表現するので、3つの特性を同時に持った継承が実現できる。
その代わり、非常に複雑になりやすいし、設計思想がわかりにくい。
わかりやすくするためには手間がかかる。


Javaの場合。

・インタフェース継承
  interfaceを用いてimplementsする。
  多重継承可能。

・実装継承
  classを用いてextendsする。
  多重継承が不可能。

・データ継承
  フィールドのみのclassを用いてextendsする。
  多重継承が不可能なので問題がある。

Javaではインタフェース継承と実装継承の2つの用途を明確に使い分けられる。
その代わり、データ継承の多重継承ができない制約がある。

こんなところだろうか。
ご意見お待ちしてます。