類和對象
面向過程編程和面向對象編程主要區別在于思維方式的不同
面向過程編程,所有的東西都需要親力親為
面向對象編程,我們可以把所有事情都可以交給具備了功能的對象完成, 不用親力親為
在編程開發中如何創建一個對象?(句子中的每個名詞,都有機會成為一個對象)
定義一個類
通過定義的類創建對象如何定義一個類
在類中說明有哪些屬性和行為, 在Go語言中可以通過結構體來說明有哪些屬性和行為
結構體的屬性 就是用于說明 屬性的
結構體的方法 就是用于說明 行為的
公私有問題
- 只要是大寫的就是共有的,只要是小寫的都是私有的
- 由于公私有性,讓面向對象有了三大特性,封裝繼承和多態
面向對象-封裝性
- 當一個類把自己的成員變量暴露給外部的時候,那么該類就失去對該成員變量的管理權,別人可以任意的修改你的成員變量,所以我們需要封裝
- 封裝之后: 提供了數據的安全性, 將變化隔離到了自己當中, 外界不用關心內部的處理, 只需要拿到方法使用即可
- 封裝的原則: 將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共的方法對其訪問
package demo
// 1.定義一個類
type Person struct {
//Name string
//Age int
name string
age int
}
// 提供了兩個對外的接口
// 本質就是對外提供了兩個公有的方法
func (p *Person)SetName(name string) {
p.name = name
}
func (p *Person)SetAge(age int) {
// 可以對外界的修改進行邏輯判斷處理
if age < 0 {
age = 0
}else if(age > 100){
age = 100
}
p.age = age
}
func (p *Person)GetName() string {
return p.name
}
func (p *Person)GetAge() int {
return p.age
}
package main
import (
"demo"
"fmt"
)
func main() {
// 2.通過類創建對象
p := demo.Person{}
p.SetName("lnj")
p.SetAge(-1)
fmt.Println(p.GetName())
fmt.Println(p.GetAge())
}
面向對象-繼承
面向對象的繼承性實際上是用結構體的匿名屬性實現的
-
繼承的規則
子類可以調用父類的方法,子類可以調用父類的屬性
子類調用父類的屬性和方法需要通過逐級查找
如果子類和父類存在相同的屬性和方法,那么采用就近原則,現在子類里找方法,找不到再在父類里找方法(方法重載)
package main
import "fmt"
type Person struct {
name string
age int
}
func (p *Person)say() {
fmt.Println(p.name, p.age)
}
// Go語言中的繼承就是通過匿名屬性來實現的
type Student struct {
Person // 匿名屬性
score int
}
func (stu *Student)say() {
fmt.Println(stu.name, stu.age, stu.score)
}
func main() {
stu := Student{}
// 屬性的繼承
stu.name = "zs"
stu.age = 18
stu.score = 66
//fmt.Println(stu)
// 方法的繼承
stu.say()
stu.Person.say()
}
面向對象-多態性
- 多態性其實就是統一事物的不同形態,在代碼中的體現就是接口
- 如果有一只狗,有一只貓,實現了動物的接口,那么那只狗/貓就可以調用自身的屬性和方法,也可以調用動物這個類的方法
- 那么當var dog Dog = Dog{"name":"旺財"}這時候的狗就是狗形態
- 那么當var animal Animal = Dog{"name":"旺財"}這時候的狗就是動物形態(Animal為接口)
package main
import "fmt"
// 1.定義一個接口
type Animal interface {
eat(name string)
}
type Dog struct {
name string
}
func (d Dog)eat() {
fmt.Println(d.name, "吃東西")
}
// 3.定義一個貓的結構體
type Cat struct {
name string
}
func main() {
//// 1.旺財狗的形態
var d Dog = Dog{"旺財"}
d.eat()
//2.旺財動物的形態
var a1 Animal = Dog{"旺財"}
a1.eat()
var d Dog = Dog{"旺財"}
eat(d)
}
func eat(a Animal) {
a.eat()
}