上一节我们讲了 Golang 接口概念 都是理论。正所谓光说不练假把式,归根结底要如何实现呢?我们接下来继续看:
接口语法格式
1 | go复制代码type 接口名 interface{ |
需要留意的是:
接口名首字母、方法名首字母 都是大写的时候,该方法能够被包(package)以外的代码调用。
举个例子:
1 | go复制代码type Filewriter interface{ |
实现接口
Golang 语言要求只要 结构体 实现了接口中 全部方法,就算继承了该接口。
换而言之,接口就是提供了一个约束,
约束继承的结构体需要实现的方法列表。
举个例子:
我们来定义一个接口 Speaker:
1 | go复制代码// Speaker 接口 |
定义两个继承 Speaker 的结构体 Teacher 和 Student:
1 | go复制代码type Teacher struct {} |
安照 Golang 要求,只需要实现了接口 Speaker 中 全部方法,就算继承了该接口。
因为接口 Speaker 中只有方法 speak() ,所以我们只需要给 Teacher、Student 分别实现方法 speak() 就可以 继承接口 Speaker
1 | scss复制代码// Teacher 实现了接口 Speaker |
以上实现了接口中的所有方法,就实现了这个接口。
继承接口作用
到这里可能会有疑问,如果 接口只是用来 约束 继承的结构体 需要实现的方法列表。而且又是非强制(毕竟你不实现全部方法也并不会像 java 那样报错),岂不是 君子协议 毫无强制约束
这里我是这么理解的:
从实现角度:结构体实现接口所有方法,即为继承接口 ,看待 接口 对 同类结构体 的写法上约束确实是非强制的。
但是:(此处应有重点)
从使用角度:**利用接口实现面向对象概念中的多态,看待 接口 对 同类接口提 进行对外使用中可调用方法的约束 这里确实非常强制的。
举个例子:
1 | go复制代码package main |
从上面代码我们可以看出,即使 结构体 Student 实现了方法 chat,但经过赋值给 类型 Speaker 变量后,也无法调用 方法 chat。
这就是我所说,使用角度,多态限制了 同类结构体 可调用方法的强制约束
本文转载自: 掘金