黑猴子的家:Scala 带有特质的对象,动态混入

在构建对象时混入某个具体的特质,覆盖掉抽象方法,提供具体实现

trait Logger3 {
  def log(msg: String)
}

trait ConsoleLogger3 extends Logger3 {
  def log(msg: String) {
    println(msg)
  }
}

class Account3 {
  protected var balance = 0.0
}

abstract class SavingsAccount3 extends Account3 with Logger3 {
  def withdraw(amount: Double) {
    if (amount > balance) log("余额不足")
    else balance -= amount
  }
}

object Main3 extends App {
  //创建对象的时候,动态混入特质
  val account = new SavingsAccount3 with ConsoleLogger3
  account.withdraw(100)
}

一个特质Logger3,一个特质ConsoleLogger3 继承了Logger3,重写了它的方法,一个Account3类,这些都没有什么好说的,然后抽象类SavingsAccount3继承Account3类,混入特质Logger3,
注意特质Logger3里面的log函数是没有实现的,一定要注意这个细节哦,想一想,抽象类SavingsAccount3混入了一个没有实现的特质Logger3,SavingsAccount3抽象类需不需要实现log函数呢??这个类是抽象的,它混入了一个抽象的特质,它是不用实现的,但是你看log(“余额不足”)这里, 竟然能调用,这个能调抽象的方法,是合理的吧, Java里面也可以,大家不要学着学着,反而忘了一门编程语言,我们继续往下看,我们new了一个抽象类的时候,动态混入了一个ConsoleLogger3特质,这个ConsoleLogger3特质是继续Logger3特质的,ConsoleLogger3 特质实现了或者叫复写了Logger3特质的抽象方法,那么在动态创建对象的时候,它会把混入的ConsoleLogger3特质所实现的抽象方法,覆盖掉SavingsAccount3抽象类混入的Logger3特质的抽象方法,变成一个实现的方法

抽象类为啥不能实例化,我们思考一下这个问题?
我们都知道,抽象类不能被实例化,抽象类的存在,就是为了被继承,它如果不被继承,没有任何的存在意义和价值,抽象类不能实例化的原因,是因为它里面有抽象方法,如果你直接实例化出来了,我调用这个方法的时候,不知道这个方法是什么东西很奇怪,走不通的,抽象类不能实例化的原因,是因为它里面有抽象方法,在Scala中,动态的解决了这个问题,只要我能够保证,我的抽象类中,没有抽象方法,我就能实例化它,但是这个过程是动态的,静态的是不行的,我们举个例子

trait Logger3 {
  def log(msg: String)
}

trait ConsoleLogger3 extends Logger3 {
  def log(msg: String) {
    println(msg)
  }
}

class Account3 {
  protected var balance = 0.0
}

abstract class SavingsAccount3 extends Account3 with Logger3 {
  override def log(msg: String):Unit = {
    println(msg)
  }
  def withdraw(amount: Double) {
    if (amount > balance) log("余额不足")
    else balance -= amount
  }
}

object Main3 extends App {
  //创建对象的时候,动态混入特质
  val account = new SavingsAccount3
  account.withdraw(100)
}

全部能成具体的,没有任何抽象的东西,这样也是不行的,还是不能实例化的,这足矣证明,这个混入的过程只能是动态的,必须是动态实现的,这也很好的顺应了,抽象类不能实例化的一个定理,这个定理是Java里面规定好的,这不是真理昂,这是人为规定的,一种行为,
Java 规定的,但是Scala 为了解决这个问题,它提出了动态混入,我们刚开始可能有点,接受不了,就这样用就好了,慢慢的就习惯了,想知道抽象类为什么不能实例化的同学,可以去研究一下jvm,这不是真理,是定理,开发和研究Java的那帮人,就喜欢这个规定

你可能感兴趣的:(黑猴子的家:Scala 带有特质的对象,动态混入)