现在的位置: 首页 > 综合 > 正文

Scala类继承与单例对象

2019年06月18日 ⁄ 综合 ⁄ 共 1289字 ⁄ 字号 评论关闭

一、Scala类继承

Scala继承一个基类跟Java很相似,只多了两点限制:1、重写方法需要override关键字,2、只有主构造函数才可以往基类的构造函数里写参数。

Scala的副构造函数必须调用主构造函数或另一个构造函数,在Scala里主构造函数如同一道关卡,类的实例需要通过他来初始化。

示例:

class Vehicle (val id:Int, val year:Int){

  override def toString() : String = "ID: " + id + " Year: " + year
  
  def make(name: String) = {
    println("Vehicle make name "+ name)
  }
}

class Car(override val id: Int, override val year: Int,
    var fuelLevel: Int)extends Vehicle(id, year) {

  override def toString() : String = super.toString() + " Fuel Level: " + fuelLevel
  
  
  override def make(name: String) = {
    println("Car make name "+ name)
  }
}

调用:

val car : Vehicle = new Car(1, 2009, 10)
println(car)
println(car.make("bmw"))

输出:

ID: 1 Year: 2009 Fuel Level: 10
Car make name bmw

二、Scala单例对象

Scala是没有静态对象和属性的,但他拥有伴生对象,

我们利用伴生对象来实现Scala的单例,如:

// 私有构造方法
class Marker private(val color:String) {

  println("Creating " + this)
  
  override def toString(): String = "marker color "+ color
  
}

// 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    def apply(color:String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    
    def getMarker(color:String) = { 
      if(markers.contains(color)) markers(color) else null
    }
}

使用:

// 方法糖 apply
println(Marker("red"))

// 单例函数调用,省略了.(点)符号
println(Marker getMarker "blue")

输出:

Creating marker color red
Creating marker color blue
Creating marker color green
marker color red
marker color blue

抱歉!评论已关闭.