go 继承

go里面严格来说是没有继承的

所谓的继承是通过匿名字段的组合来实现的

在使用其多态的时候可能会出问题

它不像java那种, 根据实际传入的类型来选择方法

type A struct {}
type B struct {
    A			// 只写出类型, 没有变量名 -- > 匿名字段
}

func (p *A) Show() {
    fmt.Println("start ...")
    p.Show2()
} 
func (p *A) Show2() {
    fmt.Println("AAA")
}

func (p *B) Show2() {	// 名称也是Show2 (属于结构体函数, 可以这样写, 不会报错)
    fmt.Println("BBB")
} 

func main() {
    b := &B{}
    b.Show()        // 相当于b先访问了自己的匿名字段A, A再调用Show()
}

// start ...
// AAA

解析: A,B 两个都是结构体, B是有一个字段是A类型的匿名字段

这种情况下, 我们为B继承了A(其实不是真正意义上的继承, 只是匿名字段而已)

B中没有Show()方法, 但是b.Show()为什么可以执行? 

其实是b.匿名字段.Show()  --> 因为匿名字段没有名字, 只有将其省略, 也就相当于b.Show()

 

当调用: 

func (p *A) Show() {
    fmt.Println("start ...")
    p.Show2()
}

的时候, 其实是匿名字段调用的Show(), 则p的值也就是A的实例

所以最后会调用A的Show2()函数, 这确实和java等其它的语言不同

### Golang 中的继承概念与实现 在 Go 语言中,并不存在传统意义上的类(class),因此也没有经典面向对象编程中的继承机制。然而,Go 提供了一种称为 **组合(composition)** 的特性来替代继承[^1]。 #### 组合式继承 当一个结构体包含了另一个或多个匿名字段(这些字段本身也是结构体),这就形成了所谓的“组合”。这种设计模式允许外部结构体直接访问内部匿名结构体的方法和属性,从而模拟了多继承的效果[^3]。 例如,在给定的例子中: ```go type Goods struct { Name string Price float64 } type Book struct { Goods // 匿名字段, 表示Book拥有Goods的所有属性 Writer string } ``` 这里 `Book` 类型不仅具有自己的 `Writer` 属性,同时也具备来自 `Goods` 的所有成员变量(`Name`, `Price`)以及任何可能定义在其上的方法。这便是通过组合实现了类似于其他语言里的单重甚至多重继承的功能[^4]。 对于更复杂的场景,可以进一步嵌入更多层次或者不同类型的结构体以构建复杂的数据模型。需要注意的是,虽然这种方式看起来像是继承关系,但实际上它只是简单地把各个部分组装在一起而已;每个组件仍然是独立存在的实体[^2]。 #### 接口与多态 除了上述提到的基于结构体的组合之外,Go 还利用接口(interface)支持多态行为。只要某个类型满足特定接口的要求——即实现了该接口所规定的一组函数签名,则此类型就可以被当作那个接口类型处理。这样就达到了动态绑定的目的,而无需依赖于传统的继承体系。 ```go // 定义一个简单的接口 type Speaker interface { Speak() string } // Dog 结构体及其Speak方法实现 type Dog struct{} func (d *Dog) Speak() string { return "Woof!" } // Person 结构体也实现了同样的接口 type Person struct{} func (p *Person) Speak() string { return "Hello!" } ``` 在这个例子中,无论是 `*Dog` 或者 `*Person` 都能作为 `Speaker` 使用,因为它们都提供了符合预期的行为实现。这是另一种形式上接近继承的概念,但在实际操作层面更加灵活且易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值