• [go学习笔记.第十章.面向对象编程] 8.面向对象的三大特性-封装


    1.面向对象编程思想-抽象

    抽象的介绍:

            前面章节讲解了在定义一个结构体的时候,实际上就是把一类事物的共有的属性(字段)和行为(方法)提取出来,形成一个物理模型(结构体),这种研究问题的方法称为抽象,如下图所示:

     

    1. package main
    2. import(
    3.     "fmt"
    4. )
    5. type  Account struct{
    6.     AccountNo string
    7.     Pwd string
    8.     Balance float64
    9. }
    10. //方法
    11. //1.存款
    12. func (account *Account) Deposite(money float64, pwd string) {
    13.     //判断密码
    14.     if pwd != account.Pwd {
    15.         fmt.Println("密码错误")
    16.         return
    17.     }
    18.     //判断金额
    19.     if money <= 0 {
    20.         fmt.Println("金额有误")
    21.     }
    22.     //增加存款
    23.     account.Balance += money
    24.     fmt.Println("存钱成功")
    25. }
    26. //2.取款
    27. func (account *Account) Withdraw(money float64, pwd string) {
    28.     //判断密码
    29.     if pwd != account.Pwd {
    30.         fmt.Println("密码错误")
    31.         return
    32.     }
    33.     //判断取款金额
    34.     if money <= 0 || money > account.Balance {
    35.         fmt.Println("金额有误")
    36.     }
    37.     //减少存款
    38.     account.Balance -= money
    39.     fmt.Println("取钱成功")
    40. }
    41. //.查询
    42. func (account *Account) Query(pwd string) {
    43.     //判断密码
    44.     if pwd != account.Pwd {
    45.         fmt.Println("密码错误")
    46.         return
    47.     }
    48.     fmt.Printf("你的账号为:%v, 余额为%v\n", account.AccountNo,account.Balance)
    49. }
    50. func main()  {
    51.     account := Account{
    52.         AccountNo:"建设银行100011",
    53.         Pwd: "123456",
    54.         Balance: 100,
    55.     }
    56.     account.Query("123456")
    57. }

     2.基本介绍

    go语言仍然有面向对象编程的继承,封装,和多态的特性,只是实现的方式和其它OOP语言不一样.

    封装的介绍:

            封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作

            这样做的好处:

                    (1).隐藏实现的细节

                    (2).可以对数据进行验证,保证数据的安全合理

    3.如何体现封装

    (1).对结构体中的属性进行封装

    (2).通过方法,包实现封装 

    4.封装的实现步骤

    (1) .将结构体,字段(属性)的首字母小写(不能导出了,其他包不能使用,类似private)

    (2).给结构体所在的包提供一个工厂模式的函数,首字母大写,类似一个构造函数

    (3).提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值

    func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {

             //加入数据验证的业务逻辑

             var 字段 = 参数

    }

    (4).提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值

    func (var 结构体类型名) GetXxx(参数列表) (返回值列表) {

            return var.属性

    }

    特别说明:

            在go语言中没有特别强调封装,这点不像java,所以不用总是用java语言语法特性来看待go,go本身对面向对象做了简化的

    5.案例

    写一个程序(Person.go),不能随便看人的年龄,工资等,并对输入的年龄进行合理的验证. 

    model包 

    1. package model
    2. import(
    3.     "fmt"
    4. )
    5. //创建一个结构体
    6. type person struct {
    7.     Name string
    8.     age int //其他包不能直接访问
    9.     sal float64
    10. }
    11. //写一个工厂模式的函数,相当于构造函数
    12. func NewPerson(name string) *person {
    13.     return &person{
    14.         Name: name,
    15.     }
    16. }
    17. //为了访问age和sal,写一对Setxxx,Getxxx方法
    18. func (p *person) SetAge(age int) {
    19.     if age > 0 && age < 100 {
    20.         p.age = age
    21.     } else {
    22.         fmt.Println("年龄不正确")
    23.         //可以给一个默认值
    24.     }
    25. }
    26. func (p *person) GetAge() int {
    27.     return p.age
    28. }
    29. //为了访问age和sal,写一对Setxxx,Getxxx方法
    30. func (p *person) SetSal(sal float64) {
    31.     if sal > 3000 && sal < 100000 {
    32.         p.sal = sal
    33.     } else {
    34.         fmt.Println("薪水不正确")
    35.         //可以给一个默认值
    36.     }
    37. }
    38. func (p *person) GetSal() float64 {
    39.     return p.sal
    40. }

     main包

    1. package main
    2. import(
    3.     "fmt"
    4.     "go_code/chapter11/exersice/model"
    5. )
    6. func main() {
    7.     p := model.NewPerson("Jack")
    8.     // p.age = 11 //错误
    9.     p.SetAge(11) //正确
    10.    
    11.     fmt.Println(p) //&{Jack 0 0}
    12.     fmt.Println("年龄:", p.GetAge())//年龄: 11
    13. }

    [上一节][go学习笔记.第十章.面向对象编程] 7.工厂模式

    [下一节][go学习笔记.第十章.面向对象编程] 9.面向对象的三大特性-继承 

  • 相关阅读:
    Android 14.0 系统强制app横屏显示功能实现
    读书笔记:《浪潮之巅:上》
    谷歌杀死IE工具栏
    海螺问问编写shell脚本zabbix监控华为设备微信接入预警
    分时进程调度和事件触发的进程调度系统
    hive3
    [附源码]java毕业设计线上图书销售管理系统
    时序分析基础(2)——input_delay
    PKDGAN: Private Knowledge Distillation with Generative Adversarial Networks
    车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/zhoupenghui168/article/details/125753244