Skip to content

鸭子类型

If it walks like a duck and quacks like a duck, then it's a duck

一个类,如果实现了鸭子的所有功能(接口),那么它就是鸭子,不必管它是外星人还是未来人还是超能力者.

它的关注点不再是继承关系或对象的类型,而是把焦点放在对象的行为上.

简单例子,如果我需要调用obj.speak(),那么不管这个obj到底是什么,之需要有这个方法就行.

既然它是一种弱化类型的多态方法,那么就会比较常见于Python等动态语言上,不过我们依旧可以在C++上利用模板元编程来实现——(会在C++章节详细说说)

用途

不依赖父类或者接口,所以实现插件就比较方便——在做单元测试的时候可以快速实现,比如测试A的时候,A依赖一个来自服务器的复杂运算,但是就可以使用鸭子类型给先暂时插入占位,保证A的逻辑等正确

同时,也可以避免“继承爆炸”——即继承太多父类(菱形继承的风险)或者太多接口

C#
class A : IMoveable, flyable, IRunable, ISwimable, I...
{
}

之需要“实现方法”就好,少了一层类型的约束

Released under the MIT License.