`

scala学习笔记(八):抽象类、trait特性

 
阅读更多

1、抽象类 和java中一样 定义抽象类需要使用abstract

 

object AbstractScala {
  def main(args: Array[String]): Unit = {
    val cat = new Cat("小小")
    cat.cry
  }
}

abstract class Animal(name:String){
  var kind:String //抽象field
def cry //抽象方法
}

class Cat(name:String) extends Animal(name){
  override var kind: String = "猫"
override def cry: Unit = println(kind + "["+name+"]" + ":喵!!")
}

 

 2、trait和java中有很大区别  java中接口方法是不能有具体的实现,同时接口也不能继承类,而scala的trait是能有具体实现也能继承类

/**
  * 继承这个trait就必须实现其中的抽象方法
*/
trait Logger{
/**
 * Scala中的Triat可以定义具体field,此时继承trait的类就自动获得了trait中定义的field
 * 但是这种获取field的方式与继承class是不同的:如果是继承class获取的field,
 * 实际是定义在父类中的;而继承trait获取的field,就直接被添加到了类中
*/
val time:Long = new Date().getTime
  val method:String //抽象字段  类在继承此trait时必须覆盖抽象time字段,提供具体的值
/**
  * 抽象方法  类似接口
  * @param msg
*/
def info(msg:String)
  /**
    * 具体的函数实现   所以如果需要重写 那么必须要加override修饰
* @param msg
*/
def error(msg:String) = {}
}

trait ImpLogger extends Logger{
  override def error(msg: String) = println(time+"->>>"+method+"->>>"+msg)
}

/**
  * 我们把类继承了trait都叫做 类混入trait
  * 在这里强调一定  java里面用implement来实现接口,scala里面只有extends 如果使用多个trait,extends后使用with
  */
class ConCreateLogger(m:String) extends Logger with Cloneable{
  val method: String = m //实现父类的抽象field
def info(msg: String): Unit = println(time+"->>>"+method+"->>>"+msg)
}

objectTraitScala {
  def main(args: Array[String]): Unit = {
    val log = new ConCreateLogger("hello")
    log.info("test")
    log.error("sss")
  /**
    * 在创建对象的时候混入特质
    * 前提:ImpLogger必须必须和ConcreateLogger一样继承于Logger,这样才能覆盖混入
  */
val log2 = new ConCreateLogger("say") with ImpLogger
    log2.error("kk")
  }
}
输出结果:
1482373668400->>>hello->>>test
1482373668668->>>say->>>kk

 

3、trait调用链以及继承多个trait的构造顺序

/**
  * 下面是测试类继承多个trait的构造顺序 同时trait也可以继承class
  */
class Animals {println("Animal is init")}
trait Furry extends Animals {println("Furry is init")}
trait HasLegs extends Animals {println("HasLegs is init")}
trait FourLegged extends HasLegs {println("FourLegged is init")}

/**
  * 继承了trait的类的构造机制如下
* 1、父类的构造函数执行;
* 2、trait的构造代码执行,多个trait从左到右依次执行;
* 3、构造trait时会先构造父trait,如果多个trait继承同一个父trait,则父trait只会构造一次;
* 4、所有trait构造完毕之后,子类的构造函数执行
*/
class Dog extends Animals with Furry with FourLegged{
  println("Cat is init")
}


trait Handler{
  def handler(data:String){}
}

trait DataHandler extends Handler{
   override def handler(data:String): Unit = {
     println("data check" + data)
     super.handler(data)
   }
}

trait SignatureHandler extends Handler{
  override def handler(data:String): Unit = {
    println("signature check" + data)
    super.handler(data)
  }
}

/**
  * trait 调用链 从右向左
* @param name
*/
class User(name:String) extends Handler with SignatureHandler with DataHandler{
  def sayHello() = {
    println("hello "+name)
    handler(name)
  }
}

object TraitScala {
  def main(args: Array[String]): Unit = {
    val cat = new Dog
    println(cat)

    val u = new User("tom")
    u.sayHello
  }
}
输出结果:
Animal is init
Furry is init
HasLegs is init
FourLegged is init
Cat is init
com.aralbox.Dog@1ae369b7
hello tom
data checktom
signature checktom

 4、基于trait的AOP实战

/**
  * 下面这个例子基于trait的AOP代码实战
  * 也就是基于trait 调用链方式
  */
trait DoAction {
  def action
}


trait AopBefore extends DoAction{
  /**
    * 在trait中,是可以覆盖父trait的抽象方法
    * 但是如果方法体使用了super.方法的代码,则无法通过编译
    * 因为super.方法就会去掉用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的
    * 此时如果要通过编译,就得给子trait的方法加上abstract override修饰
    */
  abstract override def action = {
    println("调用前执行-----------")
    super.action
    println("调用后执行-------------")
  }
}

class Work extends DoAction{
  override def action: Unit = println("Work!")
}

object TraitScala {
  def main(args: Array[String]): Unit = {

    //其实就是使用了trait调用链的特性
    val w = new Work with AopBefore
    w.action
  }
}

输出结果:
调用前执行-----------
Work!
调用后执行-------------

 

分享到:
评论

相关推荐

    Scala学习笔记,大全笔记

    Scala学习笔记,大全笔记

    scala学习笔记整理

    在"scala学习笔记整理"中,我们可以深入探讨以下关键知识点: 1. **基础语法**:Scala的基础语法与Java有相似之处,但也有很多独特的特点。例如,它支持变量的不可变性(immutability),使用`val`声明常量,`var`...

    Scala学习笔记(全)

    ### Scala学习笔记(全) #### 一、Scala概述与特点 Scala是一种多范式的编程语言,旨在集成面向对象编程和函数式编程的各种特性。它运行于Java平台(Java虚拟机JVM),并且能够完全兼容所有的Java程序。这使得Scala...

    Scala编程详解 第15讲-Scala编程详解:面向对象编程之Trait 共14页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第3讲-Scala编程详解:基础语法 共8页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第18讲-Scala编程详解:模式匹配 共11页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第5讲-Scala编程详解:函数入门 共5页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第16讲-Scala编程详解:函数式编程 共14页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第11讲-Scala编程详解:Map与Tuple 共8页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala for Java Developers: A Practical Primer(by Toby Weston)

    本书介绍Scala基本语法、构造。以及如何将您已经知道的复制java语法转换为Scala,了解Scala除了javabecome之外还提供了哪些功能编程概念和惯用技巧和建议,这些技巧和建议在将现有java项目转换为Scala时非常有用

    Scala编程详解 第10讲-Scala编程详解:数组操作之数组转换 共5页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第20讲-Scala编程详解:隐式转换与隐式参数 共9页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第17讲-Scala编程详解:函数式编程之集合操作 共9页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第7讲-Scala编程详解:函数入门之变长参数 共4页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    Scala编程详解 第6讲-Scala编程详解:函数入门之默认参数和带名参数 共5页.pptx

    Scala编程详解:数组操作之数组转换 共5页第11讲-Scala编程详解:Map与Tuple 共8页第12讲-Scala编程详解:面向对象编程之类 共12页第13讲-Scala编程详解:面向对象编程之对象 共9页第14讲-Scala编程详解:面向对象...

    在Scala中进行编程:全面的分步指南Programming in Scala: A comprehensive step-by-step guide

    《在Scala中进行编程:全面的分步指南》(Programming in Scala: A comprehensive step-by-step guide)是一本关于Scala编程语言的权威教材。这本书的独特之处在于它的共同作者是Scala语言的设计师Martin Odersky,...

    Scala学习笔记

    ### Scala学习笔记关键知识点 #### 1. “均码”哲学与并发编程 - **“均码”哲学**: 指的是Scala设计时遵循的一种设计理念,即尽量保持语言的统一性和简洁性,使得不同的功能和特性能够以一种相似的方式进行处理。...

    scala学习资料

    5. 特性与模式匹配:Scala支持特性(trait),这是一种轻量级的抽象类型,可以用来实现多重继承。模式匹配是Scala的一个强大特性,可以用于解构复杂的数据结构,简化条件判断和数据处理。 6. 高级语法:Scala的语法...

    Scala语言规范版本:2.7

    Scala的类定义可以包括构造器定义、Case类、特征等。对象的定义则是单例模式的实例化,可以通过对象定义来实现。 在表达式方面,Scala提供了一套强大的表达式系统,包括表达式类型化、字面值、指示器、函数应用、...

Global site tag (gtag.js) - Google Analytics