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

封装

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

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

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

  2. 既能够对数据进行验证,又保证数据的安全合理编码

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

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

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

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 方法)
相关文章
相关标签/搜索