型の入出力規格の互換性
型の制限の強弱
「強い・弱い」、「狭める・広げる」等が使われる。
以下の3つのクラスをもとに、型の制限の強弱を考える。
class A {}
class B : A {}
class C : B {}
それぞれを別ファイルにあると考えると分かりやすい。
- AはBの存在もCの存在も知らない。
- BはAの存在を知っているが、Cの存在は知らない。
- CはAの存在もBの存在も知っている。
このため、以下のような代入が結果となる。
B a = new A(); // NG(Bは知らないので、AがBのように振舞えない)
C a = new A(); // NG(Cも知らないので、AはCのように振舞えない)
A b = new B(); // OK(Aを知っているので、BはAのように振舞える)
C b = new B(); // NG(Cを知らないので、BはCのように振舞えない)
A c = new C(); // OK(Aを知っているので、CはAのように振舞える)
B c = new C(); // OK(Bを知っているので、CはBのように振舞える)
以上のことを考えると
- Aに対してBやCは型の制限が強い
- Cに対してAやBは型の制限が弱い
共変性(Covariance)
最初に指定された型よりも強い派生型を使用できるようにする。
派生型を返す処理も扱えるようにする。
反変性(Contravariance)
最初に指定された型よりも一般的(弱い派生)型を使用できるようにする。
基底型を受け取る処理も扱えるようにする。
不変性(Invariance)
最初に指定された型のみを使用できるようにする。