scala学习-trait学习

本文介绍了Scala中的trait概念,探讨了trait如何作为代码复用的基础单元,通过混入类中实现方法和字段的重用。文章还对比了trait与类的继承,并通过具体例子展示了trait的动态绑定特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

trait是scala中代码复用的基础单元。特质中封装了一些方法和字段,可以通过混入到类中来重用他们。
定义trait的方法:

trait ConsoleLogger{
def logger(msg: String) = {println(msg)}
}

  • 与类的继承不同,一个子类只能继承自唯一的超类,而一个类中可以混入多个特质。特质的定义与类定义除关键字不同以外,基本无大的差异。
    特质同样也是类型,但是特质与类又有区别:
    1.不可以带有任何“类”参数,即传递给类的主构造器任何参数。
    2.在类中,super的调用是静态绑定的,而trait中调用super是动态绑定的。
    比如说,先定义一个抽象类:

abstract class IntQueue {
  def get(): Int
  def put(x: Int)
}

再定义一个类继承自IntQueue类,实现了该抽象类中的抽象方法get和put,且创建了一个私有字段buf。

class BasicIntQueue extends IntQueue{
    private val buf = new ArrayBuffer[Int]
    def get() = buf.remove(0)
    def put(x: Int) { buf += x}
}

定义一个trait,继承自IntQueue,并复写了超类中的put方法

trait Doubling extends IntQueue {
    abstract override def put(x: Int) { super.put(x * 2)}
}

在上述的trait中调用的super是动态绑定的。当你定义下面类时

class MyQueue extends BasicIntQueue with Doubling

此时混入Doubling这个特质后,此时的super绑定的BasicIntQueue的put方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值