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


 

扫描二维码关注公众号,回复: 561823 查看本文章

使用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


 

猜你喜欢

转载自agilestyle.iteye.com/blog/2333901
今日推荐