11-物件導向-2-三大特性

行走的皮卡丘發表於2020-11-18

一 物件導向三大特性

1.1 封裝

封裝:把抽象出的欄位和對欄位的操作封裝在一起,資料被保護在內部,程式的其它包只有通過被授權的操作(方法),才能對欄位進行修改,其作用有:

  • 隱藏實現細節
  • 可以對資料進行驗證,保證安全合理

Golang對物件導向做了極大簡化,並不強調封裝特性,下列示例進行模擬實現:

person包下新建person.go檔案:

package person

import "fmt"

type person struct {
	Name string
	age int			//年齡是隱私,不允許其他包訪問
}

//工廠函式(類似建構函式)
func NewPerson(name string) *person {
	return &person{
		Name: name,
	}
}

func (p *person) SetAge(age int) {
	if age > 0 && age < 150 {		//校驗
		p.age = age
	} else {
		fmt.Println("年齡不合法")
	}
}

func (p *person) GetAge() int {
	return p.age
}

main.go檔案操作person:

package main

import (
	"demo/person"					// demo是go mod模式下,整體專案名
	"fmt"
)

func main() {
	p := person.NewPerson("Tom")
	p.SetAge(18)
	fmt.Println(p)
}

1.2 繼承

在 Golang 中,如果一個 struct 巢狀了另一個匿名結構體,那麼這個結構體可以直接訪 問匿名結構體的欄位和方法,從而實現了繼承特性。

package main

import (
	"fmt"
)

type Father struct {
	Name string
	age int
}
func (f *Father) run() {
	fmt.Println(f.Name + " like running...")
}

type Son struct {
	Father              //巢狀匿名結構體
}

func main() {

	var s Son

	//s.Father.Name = "Tom"
	//s.Father.age = 10     		//可以訪問未匯出屬性
	//s.Father.run()          	//可以訪問未匯出方法

	//上述可以簡寫為:
	s.Name = "Tom"
	s.age = 10
	s.run()

}

注意:

  • 當結構體和匿名結構體有相同的欄位或者方法時,編譯器採用就近訪問原則訪問,如果希望訪問匿名結構體的欄位和方法,可以通過匿名結構體名來區分。
  • 結構體嵌入多個匿名結構體,如果兩個匿名結構體有相同的欄位和方法(同時結構體本身沒有同名的欄位和方法),訪問時必須明確指定匿名結構體名字,否則編譯報錯。
  • 如果一個 struct 巢狀了一個有名結構體,這種模式就是組合,如果是組合關係,那麼在訪問組合的結構體的欄位或方法時,必須帶上結構體的名字。

關於多重繼承:如果一個 struct 巢狀了多個匿名結構體,那麼該結構體可以直接訪問巢狀的匿名結構體的欄位和方法,從而實現多重繼承。

package main

import (
	"fmt"
)

type Father1 struct {
	Name string
	age int
}
func (f *Father1) run() {
	fmt.Println(f.Name + " like running...")
}

type Father2 struct {
	Like string
}


type Son1 struct {
	Father1
	Father2
}

type Son2 struct {
	*Father1
	*Father2
}

func main() {

	s1 := &Son1 {
		Father1{
			Name: "Tom",
			age: 10,
		},
		Father2{
			Like: "伏特加",
		},
	}

	fmt.Println(s1)

	s2 := &Son2{
		&Father1{
			Name: "Tom",
			age: 10,
		},
		&Father2{
		 	Like: "伏特加",
		},
	}
	fmt.Println(s2.Father1)

}

輸出結果:

&{{Tom 10} {伏特加}}
&{Tom 10}

1.3 多型

多型與介面(interface)有關聯,參見介面章節

相關文章