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
}

 

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