1. 程式人生 > >golang 面向物件(一)繼承

golang 面向物件(一)繼承

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()中表現出自己獨有的特性。