怎样更好地实现多态?

2019-08-06 19:58:37 +08:00
 inhzus

问题:虽然这样间接地实现了多态,但是由于 Model 真的没有任何 method (方法)只有数据成员,这个类型定义为 interface{} 总之有些不优雅的感觉,想问下大家有没有更好的实现方法?

代码见 gist (或下方的图片): https://gist.github.com/inhzus/b301db257c520c15466fc833aaaec7f6

3023 次点击
所在节点    Go 编程语言
9 条回复
way2create
2019-08-06 20:09:15 +08:00
怎么我这 gist 都打不开...github 又可以
inhzus
2019-08-06 20:12:13 +08:00
@way2create #1 gist 貌似不架梯子确实比较难出去... 看图片好了= =
mm163
2019-08-06 20:52:02 +08:00
if 来 if 去的,还什么多态?
inhzus
2019-08-06 20:57:33 +08:00
@mm163 #3 用 switch 就行了,示例代码而已,没必要纠结这个吧
mm163
2019-08-06 21:02:00 +08:00
接口的多种不同的实现方式即为多态,只要针对不同的类型实现同一个接口就行了,基本的用法。
import "fmt"

type Model interface{
PrintValues()
}

type A struct {
x int
}

type B struct {
A
y int
}

func (a*A) PrintValues(){
fmt.Printf("x: %v", a.x)
}
func (b*B) PrintValues(){
fmt.Printf("x: %v, y: %v", b.x, b.y)
}
func test(model Model) {
model. PrintValues()
}
cabing
2019-08-06 21:07:04 +08:00
针对接口编程。

不要随便使用 iterface{}这种类型转来转去的。这和随意转成 void*有啥区别。
jessun1990
2019-08-06 21:17:42 +08:00
@mm163 同意,用接口实现多态最合适。
reus
2019-08-06 21:20:09 +08:00
我不反对使用 interface{},尤其是需要动态性时,用 interface{} 是必然的

不过你这个代码,和多态实在没什么关系。多态是不涉及 type assertion 的
reus
2019-08-06 21:20:32 +08:00
@cabing void* 无类型,接口有类型,这就是最大的区别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/589610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX