@
yunshangdetianya > 接口作用就是限制和约束类型
正相反。
静态类型语言的变量,类型是「唯一的」。你可能一下 get 不到有多唯一,我举个自己初学 oop 时对我帮助很大的例子
- 你的程序有两个窗口
- 窗口 A 叫 A ,B 叫<嘎>
- 你给窗口 A 声明了一个类型 type WindowA struct{ Title: A }
- 窗口 B 的类型 type WindowB struct{ Title: <嘎> }
现在你想判断鼠标点击了哪个窗口:
func findWhichClicked(x,y int) (T){}
问题来了: 应该返回什么类型?返回 A ,那么点到 B 这个函数就给不出数据了,反之亦然。
那……返回他们的公共类型?
type WindowA{Window; Title }
type WindowB{Window; Title }// AB 都来自 Window
func findWhich(x,y int) (w Window){}
但还是有问题: 我想获得点到的窗口的标题:
w := findWhich()
w.Title() // ?
做不到!
我永远只能获得 Window 的标题, 不能获得 WindowA 或者 WindowB 的标题。
「这事简直跟我是男人了就不是人了一样荒唐」!!
你可能会疑惑了,那用个公共变量呗
if inA() {w=windowA}
else if inB(){w=windowB} // 类型不匹配!,无法将 WindowA 类型的变量赋值给 Window 类型
------
接口:
type <有 title> interface {Title() }
func findWhichClicked(x,y int) <有 title> {} // windowA 和 windowB 都可以实现 <有 title>
w.Title() // w 可以是任何 <有 title>类型,运行期决定
如果 w 是 windowA ,那么调用 windowA 的实现,是 B 调用 B 的实现。
------
想想这句话: 「我要使用一个变量,它可能代表不同的东西,但类型又得是唯一的」