0Pricing
Go Academy · 课时

方法提升

通过嵌入继承方法

方法提升 是 CoddyKit 上的免费 Go Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

通过嵌入继承方法

嵌入一个类型时,它的方法也会被提升。外层类型可以像调用自身定义的方法一样调用这些方法——这是 Go 风格的继承。

提升的方法

Car 嵌入 Engine,因此免费获得其 Start 方法。

package main

import "fmt"

type Engine struct{}

func (Engine) Start() { fmt.Println("engine started") }

type Car struct{ Engine }

func main() {
	c := Car{}
	c.Start()
}

方法作用于嵌入的值

提升的方法会针对嵌入的字段运行,而不是外层结构体。它无法看到外层结构体的其他字段。

package main

import "fmt"

type Counter struct{ n int }

func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }

type Widget struct{ Counter }

func main() {
	w := Widget{}
	w.Inc()
	w.Inc()
	fmt.Println(w.Get())
}

覆盖方法

在外层结构体上定义同名方法,即可覆盖提升的方法。外层方法优先。

package main

import "fmt"

type Animal struct{}

func (Animal) Speak() string { return "..." }

type Dog struct{ Animal }

func (Dog) Speak() string { return "Woof" }

func main() {
	fmt.Println(Dog{}.Speak())
}

调用嵌入类型的方法

即使覆盖后,您仍可通过嵌入类型名称访问原始方法。

package main

import "fmt"

type Animal struct{}

func (Animal) Speak() string { return "generic" }

type Dog struct{ Animal }

func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }

func main() {
	fmt.Println(Dog{}.Speak())
}

提升与接口

由于提升的方法属于外层类型的方法集,外层类型可以使用嵌入类型的方法来满足接口。

package main

import "fmt"

type Stringer interface{ String() string }
type Base struct{ name string }

func (b Base) String() string { return b.name }

type Wrapper struct{ Base }

func main() {
	var s Stringer = Wrapper{Base{"hi"}}
	fmt.Println(s.String())
}

指针与值的方法集

如果嵌入类型具有指针接收者方法,那么只有指向外层结构体的指针(或可寻址的值)才会将这些方法提升到其方法集。

使用嵌入提供默认行为

嵌入一个提供合理默认方法的类型,然后只覆盖需要定制的少数方法——这是强大的复用模式。

package main

import "fmt"

type DefaultHandler struct{}

func (DefaultHandler) Handle() string { return "default" }

type CustomHandler struct{ DefaultHandler }

func (CustomHandler) Handle() string { return "custom" }

func main() {
	fmt.Println(CustomHandler{}.Handle())
}

没有真正的多态

与经典面向对象编程不同,嵌入的方法不会分派回外层的覆盖方法。Go 不会通过嵌入进行虚方法分派。

跨多层进行提升

方法会传递性地提升:如果 A 嵌入 B,而 B 嵌入 C,那么 A 也会获得 C 的方法,只要不存在歧义。

提升的作用

  • 无需重写即可复用行为
  • 提供可以覆盖的默认行为
  • 通过嵌入的方法满足接口

快速检查

请测试您对方法提升的了解。

回顾

您学习了方法提升。

  • 嵌入的方法会提升到外层类型
  • 外层方法会覆盖提升的方法
  • 通过嵌入类型名称访问原始方法
  • 提升有助于满足接口,但不存在虚方法分派

常见问题解答

「方法提升」课时是免费的吗?

是的 — 「方法提升」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「方法提升」这节课中我会学到什么?

通过嵌入继承方法 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「方法提升」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 嵌入结构体
  2. 嵌入接口
  3. 方法提升
  4. 组合优于继承
← 返回 Go Academy