6.2 duck typing的概念

一、duck typing的概念

  1. 举个例子:玩具鸭是鸭子嘛

    1. 传统类型系统:锁门纲目科这类判别,不是(没有生命)

    2. duck typing:外形像,像鸭子走路,叫声像,那就是鸭子

  2. 描述事务的外部行为,而非内部结构

  3. 严格说,Go语言属于结构化类型系统,类似duck typing(不是动态绑定的系统结构)

二、其他语言中的duck typing

  1. python

    def download(retriever):
        return retriever.get("https://imooc.com")

    备注:

    需要运行时候才能判断传入的retriever有没有get

    需要注释来说明接口

  2. C++

    template <class R>
    string download(const R& retriever) {
        return retriever.get("https://www.imooc.com")
    }

    备注:

    通过模板来支持

    编译时才能知道传入的retriever有没有get

    需要注释来说明接口

  3. Java

    <R extends Retriever>
    String download(R r) {
        return r.get("http://www.imooc.com")
    }

    备注:

    Java中没有duck typing,只有类似的代码

    接口方式实现的

    模板参数里面,一律使用extends

    传入的参数必须实现Retriever接口

  4. Go接口的想法

    1. 同时实现两个接口

    2. 同时具有python以及c++的duck typing的灵活性

    3. 又具有Java的类型检查

Last updated

Was this helpful?