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 方法)
相關文章
相關標籤/搜索