golang并非典型的面向对象语言,面向对象的特性不如java,c++那么明显。但是作为编程语言界最年轻的语言之一,还有一个牛逼的爹(他爹Google,,对,就是那个动不动搞个大新闻的Google),典型的富二代,golang对面向对象的支持也非常的好用,这篇文章,总结一些golang对面向对象的支持之-继承,
一,继承 ,让我们来模拟下面这个场景:
老爸有一辆车(属性),并且有开车技能(函数)。
他生的儿子,自动继承老爸的财产车和技能开车。
不仅如此,时代在发展,儿子不仅有车,还有老爸没有的私人飞机和开飞机的技能。
package main
import "fmt"
type Father struct {
name string
age string
Car struct {
speed string // 车速
brand string // 商标
}
}
func (f *Father) Driver() {
fmt.Printf("I am a driver. I can drive car\n")
}
type Son struct {
Father // 儿子,只需要在此处申明一个匿名father,就自动继承了老爸的一切
Plane struct{ //儿子除了就开车,还会开私人飞机
price string //价格
}
}
func (s *Son)Fly() {
fmt.Println("I have another personal aircraft. I can fly!")
}
func main() {
son := &Son{} // 注意,此处,如果我只是申明了一个变量var son *Son,下面的函数执行也是没有任何问题的,是不是很奇怪,一个空的结构体指针,下面的方法执行也不会报错。至于为什么,请看下一篇文章
son.Driver() //这儿子,一出生就有了车,还会开
son.Fly()
/* *******running result********************
I am a driver. I can drive car
I have another personal aircraft. I can fly!
*/
}
是不是很简单。
二,有了遗传(继承),自然少不了变异(函数,属性重写override)
假设上面的儿子(90后,有个性),开车,不想沿用老爸(70后)开车,老爸开的是解放牌手动驾驶,儿子买了辆特斯拉,谷歌自动驾驶的,看我们如何模拟这一场景
package main
import (
"fmt"
)
type Father struct {
name string
age string
Car struct {
speed string // 车速
brand string // 商标
}
}
func (f *Father) Driver() {
fmt.Printf("I am a driver. I can drive car\n")
}
type Son struct {
Father // 儿子,只需要在此处申明一个匿名father,就自动继承了老爸的一切
name string
Plane struct{ //儿子除了就开车,还会开私人飞机
price string //价格
}
}
func (s *Son) Driver() {
fmt.Println(s.name+" car. Google automatic driving")
}
func (s *Son)Fly() {
fmt.Println("I have another personal aircraft. I can fly!")
}
func main() {
son := Son{name:"Tesla"}
son.Driver() // 儿子可以开自己的特斯拉
son.Father.Driver() // 也可以这样调用,开老爸的解放牌
son.Fly()
/* *******running result********************
Tesla car. Google automatic driving
I am a driver. I can drive car
I have another personal aircraft. I can fly!
*/
}
儿子重写(override)了老爸的name字段和Driver函数,并在默认调用son.Driver()中表现出自己独有的特性。
完