Scala學習之類和屬性篇(二):定義類的輔助構造方法

在Scala中定義主構造函數使用this關鍵字:app

  • 每個輔助構造函數都須要調用以前定義的任何一個構造函數
  • 每個輔助構造函數都要有不一樣的參數表
  • 一個構造函數使用this關鍵字調用另外一個構造函數
scala> :paste
// Entering paste mode (ctrl-D to finish)

class Pizza(var crustSize: Int, var crustType: String) {
  def this(crustSize: Int) {
    this(crustSize, Pizza.DEFAULT_CRUST_TYPE)
  }

  def this(crustType: String) {
    this(Pizza.DEFAULT_CRUST_SIZE, crustType)
  }

  def this() {
    this(Pizza.DEFAULT_CRUST_SIZE, Pizza.DEFAULT_CRUST_TYPE)
  }

  override def toString = s"A $crustSize inch pizza with a $crustType crust"
}

object Pizza {
  val DEFAULT_CRUST_SIZE = 12
  val DEFAULT_CRUST_TYPE = "THIN"
}

// Exiting paste mode, now interpreting.

defined class Pizza
defined object Pizza

分別使用主構造函數和輔助構造函數來建立類的實例ide

//使用主構造函數
scala> val p1 = new Pizza(Pizza.DEFAULT_CRUST_SIZE, Pizza.DEFAULT_CRUST_TYPE)
p1: Pizza = A 12 inch pizza with a THIN crust

//使用輔助構造函數
scala> val p2 = new Pizza(Pizza.DEFAULT_CRUST_SIZE)
p2: Pizza = A 12 inch pizza with a THIN crust

scala> val p3 = new Pizza(Pizza.DEFAULT_CRUST_TYPE)
p3: Pizza = A 12 inch pizza with a THIN crust

scala> val p4 = new Pizza()
p4: Pizza = A 12 inch pizza with a THIN crust

要給case class定義一個輔助構造函數,須要在其伴生對象中增長apply方法。函數

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class Person(var name: String, var age:Int)

object Person{
  def apply() = new Person("<no name>", 0)
  def apply(name: String) = new Person(name, 0)
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

調用主構造函數和輔助構造函數來建立case class的實例對象this

//輔助構造函數
scala> val a = Person()
a: Person = Person(<no name>,0)
//輔助構造函數
scala> val a = Person("Pam")
a: Person = Person(Pam,0)
//主構造函數
scala> val a = Person("William Shatner", 27)
a: Person = Person(William Shatner,27)
//修改姓名
scala> a.name = "Leonard Nimoy"
a.name: String = Leonard Nimoy
//修改年齡
scala> a.age = 78
a.age: Int = 78
//打印對象
scala> println(a)
Person(Leonard Nimoy,78)
相關文章
相關標籤/搜索