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){}
}
Go语言不支持像Java那样的`extends`继承,而是通过在struct中声明匿名属性来实现类似继承的效果,这种机制更接近设计模式中的组合模式,允许无限制的继承。Go中的方法识别符不允许通过返回值差异定义同名方法,因此无法单纯依赖返回值实现多态。与Java不同,当函数参数为父类类型时,Go中不能传递子类对象给该参数,体现了Go的接口特性。
5万+

被折叠的 条评论
为什么被折叠?



