十面向对象编程_下
Posted jiaxiaozia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十面向对象编程_下相关的知识,希望对你有一定的参考价值。
11.1 面向对象编程思想-抽象
如何理解抽象
? 我们在之前定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为()方法提出来,形成一个物理模型(结构体),这种研究问题的方法成为抽象。
代码实现
package main
import (
"fmt"
)
// 定义一个结构体Account
type Account struct {
AccountNo string
Pwd string
Blance float64
}
// 方法:
// 1、存款
func (account *Account) Deposite(money float64, pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
// 看看存款金额是否正确
if money <= 0 {
fmt.Println("你输入的金额不正确")
return
}
account.Blance += money
fmt.Println("存款成功")
}
// 2、取款
func (account *Account) WithDraw(money float64, pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
// 看看取款金额是否正确
if money <= 0 || money > account.Blance {
fmt.Println("你输入的金额不正确")
return
}
account.Blance -= money
fmt.Println("取款成功")
}
// 3、查询
func (account *Account) Query(pwd string) {
//看看输入的密码正确与否
if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
fmt.Printf("你的账号为=%v 余额为=%v
",account.AccountNo, account.Blance)
}
func main() {
// 测试
account := Account{
AccountNo : "gs1111",
Pwd : "66",
Blance : 100.0,
}
for {
// 这里可以做的更加灵活,就是让用户通过控制台输入命令
// 菜单......
account.Query("66")
account.Deposite(200.0, "66")
account.Query("66")
account.WithDraw(150.0, "66")
account.Query("66")
}
}
11.2 面向对象编程三大特性
11.2.1 面向对象编程-封装
11.2.1.1 介绍
? 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作。
11.2.1.2 封装的理解和好处
- 隐藏实现细节
- 可以对数据进行验证,保证安全合理
11.2.1.3 如何实现封装
- 对结构体中的属性进行封装
- 通过方法,包实现封装
11.2.1.4 封装实现步骤
-
将结构体、字段(属性)的首字母小写(不能导出了,其他包不能使用,类似private)
-
给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
-
提供一个首字母大写的Set方法(类似其他语言public),用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表)(返回值列表) { // 加入数据验证的 业务逻辑 var.字段 = 参数 }
-
提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
func (var 结构体类型名) GetXxx() { return var字段; }
特别说明:在Golang开发中并没用特别强调封装,这点不想java,Golang本身对面向对象的特性做了简化的。
11.2.1.5 入门案例
? 看一个程序person.go,不能祟拜你查看人的年龄,工资的等隐私,并对输入的年龄进行合理的验证
person.go
package model
import (
"fmt"
)
type person struct {
Name string
age int //其他包无法访问
sal float64
}
// 写一个工厂模式的函数,相当于构造函数
func NewPerson(name string) *person {
return &person{
Name : name,
}
}
// 为了访问 age 和 sal 我们编写一对SetXxx和GetXxx的方法
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
}
// 设置薪水
func (p *person) SetSal(sal float64) {
if sal >= 3000 && sal < 30000 {
p.sal = sal
} else {
fmt.Println("薪水范围不对...")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
main.go
package main
import (
"fmt"
"go_code/factory/model"
)
func main() {
p := model.NewPerson("smith")
p.SetAge(18)
p.SetSal(3000)
fmt.Println(p)
fmt.Println(p.Name, "age=", p.GetAge(), "sal=", p.GetSal())
}
运行main.go文件
以上是关于十面向对象编程_下的主要内容,如果未能解决你的问题,请参考以下文章