码迷,mamicode.com
首页 > 其他好文 > 详细

十一、面向对象编程_下

时间:2020-06-08 23:50:35      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:amp   构造函数   ack   turn   理解   etag   程序   imp   main   

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\n",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文件

技术图片

十一、面向对象编程_下

标签:amp   构造函数   ack   turn   理解   etag   程序   imp   main   

原文地址:https://www.cnblogs.com/jiaxiaozia/p/13069264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!