※プログラミング学習についてのメモ書きです。
「インターフェースに対するプログラミング」と「スーパータイプに対するプログラミング」は同じ意味だと「Head Firstシリーズのデザインパターン」という本に書いてあったが、そもそもスーパータイプ(supertype)って何だ?
…結論から言えば、インターフェースに対するプログラミングという表現は、昨今のクラスを疎結合の関係性に保つためのクリーン実装だが、「スーパータイプに対するプログラミング」とは文脈によって間違えというものでもないが同義ではないので注意が必要だと思う。
そもそも、スーパータイプという言葉を聞いたことがない…ということでOOPに関する言葉を改めて学び直してみた。
スーパータイプとは?
サブクラスや実装クラスからみた上位の型。対義語はサブタイプ。
タイプはインターフェースとクラスを含む型についての概念である。
Javaだとインターフェースと抽象クラス(abstract)とクラスがそれにあたる。
なお、これらが内包するメソッド(関数)やプロパティ(変数)は、型をもたないためタイプではない。
インターフェースとは?implementsするもの
インターフェースは型を定めるもので、implements(実装)が必要になるもの。
※ちなみにインターフェースはクラスではない。
多重継承可能で複数のインターフェースの実装が可能である(それに大して抽象クラスは多重継承ができない)。定数しかもたずコンストラクタはなく、クラスの能力や役割を表すもので、共通の動作ルール(契約)を表現するためのものである。
用途としては、異なるクラスにまたがる機能を実装したい時に使用する。
スーパークラスとは?extendsするもの
スーパークラス=親クラスでありextends(継承)されるオブジェクトである。
親クラスとスーパークラスは同じものか?
結論から言うとJava界隈では、親クラスとスーパークラスは同じ意味の概念だが、親クラス(parent class)は日本でよく使われるカジュアルな言葉で正式名称は「スーパークラス」である。
スーパークラスに対するサブクラスと、親クラスに対する子クラスも同様である。
そもそも「型(type)」とはなにか?
型は…クラスとインターフェースであり、クラスには具体クラス(concrete class)と抽象クラス(abstract class)がある。
つまり…
- 型(タイプ)
- クラス
- 具体クラス
- 抽象クラス
- インターフェース
- クラス
まとめ
- タイプ(型)
- スーパークラス
- インターフェース
- クラス
- 具体クラス
- 抽象クラス
- インターフェース
※スーパータイプは下位概念からみたタイプである。
結論
「インターフェースに対するプログラミング」は「スーパータイプに対するプログラミング」を含むが同義ではないので注意が必要である。
コメント