scala中object繼承abstract class

在scala中的object類似java中的static一樣,其實反編譯之後就可以看到也是一個類,只不過名稱爲原來的名稱最後再加了一個$,我們一般沒有用到一個繼承自abstract class的object,我也是查看GenTraversable.scala源碼中發現這樣的用法:

GenTraversable.scala中 object GenTraversable extends GenTraversableFactory[GenTraversable]

所以我做了一個實驗,代碼如下:

object ObjectExtendsAbstractClass {
  def main(args: Array[String]): Unit = {
    val v = Conversions.milesToKilometers(10)
    println(v) //16.0

    var ucv:UnitConversions = Conversions //這個地方不能用new,不管哪種寫法我都無法new成功,只能用object的名字才OK
    println(ucv.milesToKilometers(3)) //4.800000000000001

    val iu1 = ucv.createinst
    val iu2 = ucv.createinst
    println(iu1)
    println(iu2)
    println(iu1 == iu2)
    val iu3 = ucv.createinst2
    val iu4 = ucv.createinst2
    println(iu3)
    println(iu4)
    println(iu3 == iu4)
    //scala.joe.com.implicits.Conversions$@76a4d6c
    //scala.joe.com.implicits.Conversions$@76a4d6c
    //true
    //scala.joe.com.implicits.Conversions$@76a4d6c
    //scala.joe.com.implicits.Conversions$@76a4d6c
    //true
    //
  }
}
//  GenTraversable.scala中 object GenTraversable extends GenTraversableFactory[GenTraversable]
//通過查看源代碼發現這個語法就是object extends abstract class形式

object Conversions extends UnitConversions
{
  override def inchesToCentimeters(inches:Int) = inches * 2.5
  override def gallonsToLiters(gallons:Int) = gallons * 3.78
  override def milesToKilometers(miles:Int) = miles * 1.6

  override def createinst: UnitConversions = this

  override def createinst2: UnitConversions = Conversions
}

abstract class UnitConversions
{
  def inchesToCentimeters(inches:Int):Double
  def gallonsToLiters(gallons:Int):Double
  def milesToKilometers(miles:Int):Double
  def createinst:UnitConversions
  def createinst2:UnitConversions
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章