go并没有类似于java那样extends的继承,go对继承的实现更像设计模式中的组合模式。通过在struct中声明一个匿名属性来实现继承,所以go的继承是无数量限制的。
// 父类
type Animal struct {
name string
}
// 父类方法
func (a *Animal) Speak() {
fmt.Println("动物发出声音")
}
// 子类嵌入父类
type Dog struct {
Animal // 嵌入 Animal 结构体
breed string
}
// 子类方法(会继承父类方法)
func (d *Dog) Bark() {
fmt.Println("汪汪汪!")
}
func main() {
dog := Dog{Animal: Animal{name: "旺财"}, breed: "拉布拉多"}
dog.Speak() // 继承自父类 Animal 的方法
dog.Bark() // 子类自己的方法
}
go方法识别符类似于java,也无法单纯通过返回值不同来达到多态
package main
import "fmt"
type Calculator struct{}
func (c Calculator) Add(a, b int) int {
return a + b
}
// 编译错误:method Add already declared for Calculator
func (c Calculator) Add(a, b int) float64 {
return float64(a + b)
}
func main() {
calc := Calculator{}
result := calc.Add(2, 3)
fmt.Println(result)
}
之所以说go的继承是组合,还有一个java中很常见的操作,在go是行不通的。如果一个方法的参数是父类,java中是可以传子类对象的,比如下面的 test方法,可以传Cat实例,但是go中的函数不可以,只能传Animal对象,不能传子类的对象
class Animal {}
class Cat extengs Animal {}
class Test {
public void test(Animal an){}
}