面向对象
- 概念
强调具备了功能的对象,关注的是解决问题需要哪些对象 - 如何创建一个对象?
- 定义一个类
- 通过定义的类创建对象
- 在类中说明有哪些属性和行为,在Go语言中可以通过结构体来说明有哪些属性和行为
- 结构体的属性 就是用于说明 属性的
- 结构体的方法 就是用于说明 行为的
package main
import "fmt"
//定义一个类
type Person struct {
name string
}
// 行为属性
func (cm Person)say(){
fmt.Println("我叫",cm.name)
}
func main() {
// 根据类创建对象
people := Person{"小红"}
people.say()
}
- 在Go语言中,同一个包中的内容可以随意访问
- 在Go语言中,要想访问其他包中的内容,那么内容名称的首字母必须
大写
- 要想访问全局变量,导入对应的包之后,可以通过
包名.变量名
- 要想访问其他包的方法,和方法, 需要导入对应的包之后,可以通过
包名 . 方式名
的方式访问
面向对象的三大特性—-封装性
- 封装之后: 提供了数据的安全性
- 封装的原则: 将不需要对外提供的内容都隐藏起来,把属性隐藏,提供公共的方法对齐访问
//定义了一个类 但是属性时私有的
type Person struct {
name string
age int
}
// 对外开放的方法
func (p *Person)setName(name string){
p.name = name
}
// 对外开放的方法
func (p *Person)setAge(age int){
if age<0 {
p.age = 0
}else if age>100 {
p.age = 100
}
p.age = age
}
面向对象的三大特性—-继承性
package main
type Person struct {
name string
age int
}
// 学生的结构体继承了人Person的属性
type Student struct {
Person
score int
class string
}
func main() {
var stu = Student{}
stu.name = "小明" // 那么 student 就能使用Person里的属性了
stu.age = 12
stu.score = 100
stu.class = "六年级"
}
- 继承后子类可以使用父类的属性和方法
- 如果子类和父类出现了同名的属性,那么会采用就近原则
- 如果子类和父类出现了重名的属性,要想访问父类的属性,必须逐级查找
- 如果子类和父类出现了重名的方法,也采用就近原则(方法的重载)
- 如果子类和父类出现了重名的方法,要想访问父类的f方法,必须逐级查找
面向对象的三大特性—-多态性
package main
import "fmt"
// 定义一个结构
type Animale interface {
shout(mode string)
}
type Dog struct {
name string
mode string
}
func (Dog)shout(mode string){
fmt.Println("叫了一声",mode)
}
type Cat struct {
name string
mode string
}
func (Cat)shout(mode string){
fmt.Println("叫了一声",mode)
}
func main() {
var dog Animale = Dog{"汪星人","汪汪汪"}
var cat Animale = Cat{"喵星人","喵喵喵"}
shoutMode(dog) // {汪星人 汪汪汪}
shoutMode(cat) // {喵星人 喵喵喵}
}
// 定义动物叫的方式
func shoutMode(animale Animale){
fmt.Println(animale)
}