Cris 的 Scala 笔记整理(八):面向对象中级-封装

本文深入探讨了封装的概念及其在软件开发中的应用,从数据角度讲解了封装如何保护内部数据,确保数据的安全性和合理性,同时介绍了封装在模块层面的作用,即通过共有的模块提高开发效率,减少重复编码。
封装

​ 从数据的角度:封装 (encapsulation) 就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作

​ 从模块的角度:封装就是将需要重复使用的逻辑封装成共有的模块,提高开发效率,减少重复性编码

封装的理解和好处(以数据为例)
  1. 隐藏实现细节

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

如何体现封装(以数据为例)
  1. 通过成员方法实现对属性的封装,通过包实现对类的封装
封装的实现步骤(以数据为例)
  1. 将属性进行私有化

  2. 提供一个公共的 set 方法,用于对属性判断并赋值

  3. Java 和 Scala 提供的访问权限修饰符

def  setXxx(参数名 : 类型) : Unit = {
		//加入数据验证的业务逻辑
		属性 = 参数名   
	}
复制代码
  1. 提供一个公共的 get 方法,用于获取属性的值
def getXxx() [: 返回类型] = {
	return 属性
    }
复制代码
Scala 封装案例演示

创建一个员工类,对其必要属性进行私有化,并限制年龄只能为 [0,120]

object StuffDemo {
  def main(args: Array[String]): Unit = {
    val stuff = new Stuff(sex = 'M')
    println(stuff) // Stuff(2000.0, 18, M)

    stuff.setAge(24)
    println(stuff) // Stuff(2000.0, 24, M)

    stuff.setAge(190)
    println(stuff) // Stuff(2000.0, 24, M)
  }

}

/**
  * 可以在主构造器中定义属性的默认值,甚至是设置属性的访问权限,但是失去了对属性的控制(解决方式是可以在调用构造方法前对设置的属性进行验证)
  *
  * @param salary
  * @param age
  * @param sex
  */
class Stuff(private var salary: Double = 2000, val sex: Char) {
  private var age: Int = 18

  def setAge(age: Int): Unit = {
    if (age >= 0 && age <= 120) {
      this.age = age
    }
  }

  override def toString = s"Stuff($salary, $age, $sex)"
}
复制代码
细节
  1. Scala 中为了简化代码的开发,在类中声明属性时,自动提供对应的 setter/getter 方法(方法名为 属性名_&eq/属性名);如果属性访问权限声明为 private,对应 setter/getter 方法的访问权限是 private;如果属性声明省略访问权限(编译器会自动为其加上 public 访问权限),对应 setter/getter 方法的访问权限是 private
  2. 如果仅仅只是对一个属性进行简单的 set 和 get,只需要声明该属性即可;访问属性直接使用 对象.属性 即可(实质上是调用编译器自动生成的 getter 方法);设置属性直接使用 对象.属性=xxx 即可(实质上是调用编译器自动生成的 setter 方法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值