go初学记录:继承

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

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){}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值