scala面向对象编程之trait特质

简介: 特质就像是java的implement,是scala中代码复用的基础单元,它可以将方法和字段定义封装起来,然后添加到类中与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。特质的定义和抽象类的定义很像,但它是使用trait关键字

简介

特质就像是java的implement,是scala中代码复用的基础单元,它可以将方法和字段定义封装起来,然后添加到类中与类继承不一样的是,类继承要求每个类都只能继承一个超类,而一个类可以添加任意数量的特质。特质的定义和抽象类的定义很像,但它是使用trait关键字

1、作为接口

使用使用extends来继承trait(scala不论是类还是特质,都是使用extends关键字)如果要继承多个trait,则使用with关键字

trait B {...}
trait C {...}
class D
class A extends D
class A extends D with B
class A extends B
class A extends B with C

示例一:继承单个trait

trait Logger1 {
  // 抽象方法
  def log(msg:String)
}

class ConsoleLogger1 extends Logger1 {
  override def log(msg: String): Unit = println(msg)
}

class FileLogger2 extends Logger1 {
  override def log(msg: String): Unit = println(msg)
}

object LoggerMain {
  def main(args: Array[String]): Unit = {
    val logger = new ConsoleLogger1
    logger.log("控制台:这是一条日志")
  }
}

在这里插入图片描述

示例二:继承多个trait

trait Logger1 {
  // 抽象方法
  def log(msg:String)
}

trait Exception1 {
  def throwException(msg:String)
}

class FileLogger2 extends Logger1 with Exception1 {
  override def log(msg: String): Unit = println(msg)

  override def throwException(msg: String): Unit = println(msg)
}

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

    val fileLogger = new FileLogger2
    fileLogger.log("文件:这是一条日志")
    fileLogger.throwException("文件:这里有一个异常!")
  }
}

在这里插入图片描述

2、定义具体的方法

和类一样,trait中还可以定义具体的方法。
例子:

trait LoggerDetail {
  // 在trait中定义具体方法
  def log(msg:String) = println(msg)
}

class PersonService extends LoggerDetail {
  def add() = log("添加用户")
}

object MethodInTrait {
  def main(args: Array[String]): Unit = {
    val personService = new PersonService
    personService.add()
    personService.log("添加好了")
  }
}

在这里插入图片描述

3、定义具体方法和抽象方法

在trait中,可以混合使用具体方法和抽象方法使用具体方法依赖于抽象方法,而抽象方法可以放到继承trait的子类中实现,这种设计方式也称为模板模式。
示例:

trait Logger3 {
  // 抽象方法
  def log(msg:String)
  // 具体方法(该方法依赖于抽象方法log
  def info(msg:String) = log("INFO:" + msg)
  def warn(msg:String) = log("WARN:" + msg)
  def error(msg:String) = log("ERROR:" + msg)
}

class ConsoleLogger3 extends Logger3 {
  override def log(msg: String): Unit = println(msg)
}

object LoggerTrait3 {
  def main(args: Array[String]): Unit = {
    val logger3 = new ConsoleLogger3
    logger3.log("这是一条日志")

    logger3.info("这是一条普通信息")
    logger3.warn("这是一条警告信息")
    logger3.error("这是一条错误信息")
  }
}

在这里插入图片描述

4、定义具体字段和抽象字段

在trait中可以定义具体字段和抽象字段继承trait的子类自动拥有trait中定义的字段,字段直接被添加到子类中
示例

trait LoggerEx {
  // 具体字段
  val sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm")
  val INFO: String = "信息:" + sdf.format(new Date)
  // 抽象字段
  val TYPE:String

  // 抽象方法
  def log(msg:String)
}

class ConsoleLoggerEx extends LoggerEx {
  // 实现抽象字段
  override val TYPE: String = "控制台"
  // 实现抽象方法
  override def log(msg:String): Unit = print(s"$TYPE $INFO $msg")
}

object FieldInTrait {
  def main(args: Array[String]): Unit = {
    val logger = new ConsoleLoggerEx

    logger.log("这是一条消息")
  }
}

在这里插入图片描述

5、实例对象混入trait

trait还可以混入到实例对象中,给对象实例添加额外的行为,只有混入了trait的对象才具有trait中的方法,其他的类对象不具有trait中的行为,使用with将trait混入到实例对象中
例子:

trait LoggerMix {
  def log(msg:String) = println(msg)
}

class UserService

object FixedInClass {
  def main(args: Array[String]): Unit = {
    // 使用with关键字直接将特质混入到对象中
    val userService = new UserService with LoggerMix

    userService.log("混入了特质")
  }
}

在这里插入图片描述

目录
相关文章
|
6月前
|
Java Scala
scala中的面向对象编程
scala中的面向对象编程
30 3
|
6月前
|
分布式计算 Java Scala
Scala:面向对象、Object、抽象类、内部类、特质Trait(二)
Scala:面向对象、Object、抽象类、内部类、特质Trait(二)
91 0
|
大数据 Scala 容器
【建议收藏】|3分钟让你学会Scala Trait 使用
Scala 是一种强大的静态类型编程语言,其中的 Trait 是一种重要的特性。Trait 可以被看作是一种包含方法和字段定义的模板,可以被其他类或 Trait 继承或混入。在本文中,我们将介绍 Scala Trait 的边界(Boundary)的概念,并展示如何使用它来限制 Trait 的使用范围。
257 11
|
Java Scala
scala面向对象编程之类与对象
scala是支持面向对象的,也有类和对象的概念。 示例:定义一个User类,并添加成员变量/成员方法,创建一个Main object,添加一个main方法,并创建Customer类的对象,并给对象赋值,打印对象中的成员,调用成员方法
112 0
scala面向对象编程之类与对象
|
分布式计算 Java Scala
scala面向对象编程之继承
scala使用extends关键字来实现继承。可以在子类中定义父类中没有的字段和方法,或者重写父类的方法。 示例1:实现简单继承
161 0
scala面向对象编程之继承
|
大数据 编译器 Scala
大数据开发基础的编程语言的Scala的Trait
Scala是一种支持面向对象编程和函数式编程的编程语言,它提供了强大的Trait功能。本文将介绍Scala中Trait的概念和用法,帮助开发者更好地理解和应用这门语言。
95 0
|
Java Scala
Scala快速入门-8-特质
Scala和Java一样不允许类继承多个超类,特质解决这一局限性 类可以实现任意数量的特质 当将多个特质叠加在一起时,顺序很重要,其方法先被执行的特质排在更后面 Scala特质可以提供方法和字段的实现 特质要求实现它们的类具备特定的字段、方法或超类 特质可以同时拥有抽象方法和具体方法,而类可以实现多个特质
|
设计模式 XML Java
基于Scala Trait的设计模式
基于Scala Trait的设计模式
|
Java Scala
Scala语法详解:特质 (Traits)
Scala语法详解:特质 (Traits)
129 0
|
大数据 Scala Java
大数据Scala系列之特质
  大数据Scala系列之特质,特质的定义除了使用关键字trait之外,与类定义无异。   特质用来在类之间进行接口或者属性的共享。类和对象都可以继承特质,特质不能被实例化,因此也没有参数。   一旦特质被定义了,就可以使用extends或者with在类中混入特质。
812 0