Scala Inheritance
原创转载请注明出处:http://agilestyle.iteye.com/blog/2333901
同Java类似,使用extends关键字实现继承
package org.fool.scala.inheritance class Person { val height = 180 val weight = 160 } class Teacher extends Person class Student extends Person object Person extends App { def display(p: Person) = s"height: ${p.height} weight: ${p.weight}" println(display(new Person)) println(display(new Teacher)) println(display(new Student)) }
Console Output
使用构造器参数重写Person
package org.fool.scala.inheritance class Person2(val height: Int, val weight: Int) class Teacher2(height: Int, weight: Int) extends Person2(height, weight) class Student2(height: Int, weight: Int) extends Person2(height, weight) object Person2 extends App { def display(p: Person2) = s"height: ${p.height} weight: ${p.weight}" println(display(new Person2(180, 160))) println(display(new Teacher2(167, 90))) println(display(new Student2(178, 130))) }
Console Output
在继承时,子类构造器必须调用基类的主构造器。如果基类中有辅助(重载的)构造器,那么可以选择改为调用这些构造器中的某一个。子类的构造器必须将适合的参数传递给基类构造器:
package org.fool.scala.inheritance class House(val address: String, val state: String, val zip: String) { def this(state: String, zip: String) = this("address?", state, zip) def this(zip: String) = this("address?", "state?", zip) } class Home(address: String, state: String, zip: String, val name: String) extends House(address, state, zip) { override def toString = s"$name: $address $state $zip" } class VacationHouse(state: String, zip: String, val startMonth: Int, val endMonth: Int) extends House(state, zip) class TreeHouse(val name: String, zip: String) extends House(zip) object AuxiliaryInitialization extends App { val home = new Home("District JingAn", "Shanghai", "200000", "JingAnSi") println(home.address) println(home.state) println(home.zip) println(home.name) println(home) val vacationHouse = new VacationHouse("Shanghai downtown", "200001", 7, 8) println(vacationHouse.state) println(vacationHouse.zip) println(vacationHouse.startMonth) println(vacationHouse.endMonth) println(vacationHouse) val treeHouse = new TreeHouse("Shanghai Center", "200002") println(treeHouse.name) println(treeHouse.zip) println(treeHouse) }
Console Output
使用override关键字覆盖方法
package org.fool.scala.inheritance class Person3 { def call = "Person invoked.." var energy = 100; def eat() = { energy += 10; energy } def work(x: Int) = energy -= x } class Teacher3 extends Person3 { override def call: String = "Teacher invoked.." // Modify the base-class var energy = 80 override def eat() = super.eat() * 2 def say() = "Teacher say.." } class Student3 extends Person3 { override def call: String = "Student invoked.." override def eat() = super.eat() * 3 def doHomework() = "Student do homework.." var word = "Teacher is a sb!" } object Person3 extends App { def show(p: Person3) = { p.eat() p.call + p.eat() } println(show(new Person3)) println(show(new Teacher3)) println(show(new Student3)) }
Console Output