一、协变和逆变
协变(Covariance) 和 逆变(Contravariance),面向对象编程的语言里都可以看到这两个定义。看一个比较严格的定义:
逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(A≤B表示A是由B派生出来的子类)
f(⋅)是逆变(contravariant)的,当A≤B时有f(B)≤f(A)成立;
f(⋅)是协变(covariant)的,当A≤B时有f(A)≤f(B)成立;
f(⋅)是不变(invariant)的,当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系。
估计数学有点不好的,得琢磨一下。
协变和逆变其实应用更多是在泛型编程中,在一般的编程中,反而有更具体的行为规范。所以可以把协变和逆变称为一种更高一层的抽象概念。协变是从父类型到子类型中,类型越来越具现化或者说更具体;逆变是从父类到子类型中,类型越来越抽象(注意表述的本质)。
二、具体分析说明
其实只要明白了一点就明白了它的作用,就是用来处理继承关系的类型转换控制的。说成大白话就是,协变就是某种操作被应用到父子类型(子≤父)后,子类型还是子类型,父类型还是父类型,但父类型可以由子类型来表示(就是父类型的变量可以由子类型的变量赋值,这个好理解,也是上面提到的越来越具体)。举一个比较简单的例子就是:
class Father{
};
class Son:public Father{
};
Father *