效果
1,少写一个factory method
2,不需要控制构造函数的访问权限
抗变与协变
问题在override虚函数时,子类有时想要返回或处理与父类函数参数和返回值略微不同的类型,比如假设“动物类”有一个“伴侣”的虚函数,其返回值类型为“动物类”,但子类“兔子”override“伴侣”时,需要把返回值改为“兔子”;假设“鸟类”有一个“进食”的虚函数,其参数类型为“谷类”,但子类“食铁鸟”override“进食”时,需要把参数改为“碱性食物”;这时,除了使用泛型可以解决外,就需要用到抗变与协变
定义
抗变:向父类的方向变化
协变:向子类的方向变化
语言支持
返回值抗变与参数协变会带来明显的类型安全问题,因此,常用的基本是返回值协变与参数抗变;对抗变与协变支持的最全面的是eiffel,它同时提供了受束泛型来解决返回值抗变与参数协变带来的类型安全问题
|
[c++] 只支持返回值协变 class animal { public: virtual animal const& spouse() = 0; };
class rabbit : public animal { public: rabbit const& spouse(){ return rabbit(); } }; |
[c#] 不支持 [java] 1.5之前不支持,1.5与泛型结合,有限度的支持协变; 另外迫于checked exception的蹩脚实现,java支持异常声明的协变
|