11-物件導向-2-三大特性
一 物件導向三大特性
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)有關聯,參見介面章節
相關文章
- golang 物件導向特性Golang物件
- 物件導向有哪些特性物件
- Ext學習筆記2-物件導向筆記物件
- Java物件導向三大特性Java物件
- 08 ### 物件導向三大特性物件
- 物件導向 -- 三大特性之多型物件多型
- Python物件導向三大特性Python物件
- C++物件導向三大特性C++物件
- 物件導向-物件導向思想物件
- 2.1.1 Python物件導向三大特性Python物件
- 物件導向 -- 三大特性之繼承物件繼承
- 物件導向 -- 三大特性之封裝物件封裝
- java基礎 - 物件導向三大特性Java物件
- 第十八章 物件導向的特性物件
- [.net 物件導向程式設計基礎] (13) 物件導向三大特性——多型物件程式設計多型
- [.net 物件導向程式設計基礎] (12) 物件導向三大特性——繼承物件程式設計繼承
- [.net 物件導向程式設計基礎] (11) 物件導向三大特性——封裝物件程式設計封裝
- 設計模式(二):物件導向及其特性分析設計模式物件
- swift物件導向特性——類和結構體Swift物件結構體
- C#物件導向三大特性總結C#物件
- Java物件導向04——三大特性之多型Java物件多型
- 深入理解物件導向,物件導向3個特性7個原則6種關係物件
- 程式導向與物件導向物件
- 物件導向與程式導向物件
- “程序導向”和“物件導向”物件
- 【Java基礎知識】物件導向有哪些特性Java物件
- Java中物件導向三大特性之繼承Java物件繼承
- PHP物件導向深入研究之【高階特性】PHP物件
- Java物件導向03——三大特性之繼承Java物件繼承
- 『Java 語法基礎』物件導向有哪些特性Java物件
- 物件導向物件
- 物件導向,搞定物件物件
- PHP 物件導向 (九)物件導向三大特徵PHP物件特徵
- JAVA物件導向基礎--物件導向介紹Java物件
- 從程式導向到物件導向物件
- 物件導向三大特性-----封裝、繼承、多型物件封裝繼承多型
- 物件導向(下)物件
- 物件導向 -- 反射物件反射