最近在学习Go语言,其中遇到了一个关于go接口继承问题,希望可以得到大家的解答。
正常继承interface的代码段如下:
```go
package main
import (
"fmt"
)
//定义interface
type VowelsFinder interface {
FindVowels() []rune
}
type MyString string
//实现接口
func (ms MyString) FindVowels() []rune {
return 'ok'
}
func main() {
name := MyString("Sam Anderson") // 类型转换
var v VowelsFinder // 定义一个接口类型的变量
v = name
fmt.Printf("Vowels are %c", v.FindVowels())
}
```
其中 `main` 方法中的 `name` 变量为 `MyString` 类型( `MyString` 的结构体函数实现了 `VowelsFinder` 接口),然后将 `name` 转换为 `VowelsFinder` 类型,说明继承完成。
但是我的疑问点是:即使不进行 `v=name`的 类型转码,变量 `name` 本来就是`VowelsFinder` 类型,已经继承完成。如下改动代码:
```go
func findType(i interface{}) {
switch v := i.(type) {
case VowelsFinder:
fmt.Println("VowelsFinder type.", v);
default:
fmt.Printf("unknown type\n")
}
}
func main() {
name := MyString("Sam Anderson")
findType(name) // VowelsFinder type.
}
```
通过 `findType` 函数得到变量 `name` 已经是接口 `VowelsFinder` 的类型了,那么是上面main函数的代码是否实现了Go语法中标准的继承呢?
go是强类型绑定的语言,所以无法实现真正的继承,
现在好多的所以实现继承的变通方法都是有很大的局限性。
楼主还是不要异想天开了,如果实在需要继承,那就选择java等OO的语言更合适。
#4
更多评论