试了下 Swift 是不行,因为 Swift 需要显示的继承 protocol 才可以。 Python 可以吗?
1
FutherAll OP 像 Go 的 http 的标准库 HandlerFunc 实现 Handler 接口这样
![go.png]( https://s1.ax1x.com/2020/10/04/0Gai59.png) Swift 好像没办法这样写的 ![swift.png]( https://s1.ax1x.com/2020/10/04/0GakCR.png) |
2
geelaw 2020-10-04 17:21:55 +08:00 via iPhone
请问你说的是 C++ 的 operator ()、C# 的委托、Python 的可调用类型、JavaScript 的 function 吗?
|
3
ciaoly 2020-10-04 17:57:32 +08:00 via Android
|
4
hakono 2020-10-04 18:12:47 +08:00 via Android
楼主意思是其他语言有没有像 go 那样,对象不用明确声明,只要实现了对应的函数就可以隐式实现接口?
|
5
littlewing 2020-10-04 18:21:57 +08:00
c++ 的 function object,不过是把 object 当函数用
|
6
reus 2020-10-04 18:31:59 +08:00 1
楼主的意思是,定义一个命名的函数类型,然后给这个类型增加方法,从而实现某个接口
例如 type Foo interface { Foo() } type Bar func() func (b Bar) Foo() {} 上面的代码,定义了一个名为 Bar,底层类型为 func() 的类型,这就是标题所说的“函数类型” 这个 Bar 类型还定义了一个 Foo 方法,从而实现 Foo 接口,就是标题所说“使用函数类型实现接口” 大部分静态语言都做不到给任意的类型命名,更不用说给任意类型增加方法 Haskell 是可以的,其他不清楚了 |
7
teawithlife 2020-10-04 19:17:10 +08:00
这叫 duck typing, 比如 python 就支持
|
8
FutherAll OP @reus 是的多谢解答,比如 Swift 没办法给 typealias 的函数类型进行 extension 。
可能是跟方法调用的实现机制相关。我去了解一下 Haskell |
9
FutherAll OP @teawithlife Python 是可以的是吗?我去看一下
|
10
FutherAll OP 我理解有两个条件:
1. 对 alias 的类型,是否可以添加方法 2. 是否可以声明实现某个接口的,或者像 Golang 和 Python 这样的 duck typing |
11
codehz 2020-10-04 20:05:08 +08:00
py 这种直接鸭子类型应该可以算可以
这种效果来说的话,你 c++也可以做 concept 。。。 以及 typescript 的类型系统也是允许这种情况( js 就不说了,你都不用声明类型) |