面向对象编程三大特征1

封装介绍:

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


封装的理解和好处:

  1)隐藏实现细节
  2)提可以对数据进行验证,保证安全合理

type Person struct {
  Age int
}


如何体现封装:

  1)对结构体中的属性进行封装
  2)通过方法,包 实现封装


封装的实现步骤:

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

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

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

func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {
  //加入数据验证的业务逻辑
  var.字段 = 参数
}

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

func (var 结构体类型名) GetXxx() {
  return var.字段;
}

特别说明:在Golang开发中并没有特别强调封装,这点并不像java,不要总是用java的语法特性来看待Golang,Golang本身对面向对象的特性做了简化的。

快速入门案例:

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

代码实现:

model/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/main.go

package main
import (
  "fmt"
  "chapter04/chapter08/model"
)

func main() {

  p := model.NewPerson("smith")
  p.SetAge(18)
  p.SetSal(5000)
  fmt.Println(p)
  fmt.Println("name=", p.Name, "age=", p.GetAge(), "sal=", p.GetSal())
}

执行的结果:

 

原文地址:https://www.cnblogs.com/green-frog-2019/p/11408264.html