原创转载请注明出处: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

本文介绍了Scala中继承的基本概念及实现方式,并通过实例详细解释了如何使用构造器参数重写父类属性,以及如何在子类构造器中调用父类的不同构造器。此外,还展示了如何使用override关键字来覆盖父类的方法。
1万+

被折叠的 条评论
为什么被折叠?



