这个成语有名字吗?

Posted

技术标签:

【中文标题】这个成语有名字吗?【英文标题】:Is there a name for this idiom? 【发布时间】:2017-02-04 20:07:23 【问题描述】:

这个习语有名字吗?根据接口类型选择函数?

type encoderFunc func(e *encodeState, v reflect.Value, opts encOpts)

var encoderCache struct 
    m map[reflect.Type]encoderFunc


func (e *encodeState) marshal(v interface, opts encOpts) (err error) 
    v := refect.ValueOf(v)
    valueEncoder(v)(e, v, opts)
    return nil


func valueEncoder(v reflect.Value) encoderFunc 
     return encoderCache.m[v.Type()]

从encoding/json 复制并稍作改动以进行演示。

【问题讨论】:

我不知道 Go,但这让我觉得是一种继承。如果函数是 ABC 而不是接口的一部分,则该语言会根据其类型自动选择正确的方法。 @Carcigenicate,你指的是哪个功能?我认为这与继承无关。涉及的类型完全不相关。 Nvm,我想我看错了代码。从顶部的描述和代码来看,您似乎是在根据对象的类型分派一个函数。 一个函数确实是根据对象的类型“分派”的,但这些类型彼此完全无关。通过继承(可能是多态),被调用的函数取决于对象的类型——但对象都是特定的父类型。 【参考方案1】:

我称之为动态方法调度。或多或少与 Go 接口实现中使用的机制相同,其中 map[reflect.Type]encoderFunc 调用 i-table。甚至可以仅使用接口重写编组,但我们不能为内置类型编写方法。

type encodable interface
    encode(e *encodeState, opts encOpts)

func (st SomeType) encode(e *encodeState, opts encOpts)
...

...
func (ot OtherType) encode(e *encodeState, opts encOpts)
...

func (e *encodeState) marshal(v encodable, opts encOpts) (err error) 
    v.encode(e, opts)
    return nil

【讨论】:

以上是关于这个成语有名字吗?的主要内容,如果未能解决你的问题,请参考以下文章

这个 API 设计模式有名字吗?

这个算法有名字吗? (我一直称它为changeBinary)

这个基于数组的数据结构有名字吗?

这个设计模式有名字吗? (具有仅调用构造函数的实现的基类)

Python中从一些成语中各提取一个字组成一句话有啥方法

这个 UIControl 叫啥名字?