美文网首页Scala编程与实践
【Scala类型系统】自身类型(self type)引用

【Scala类型系统】自身类型(self type)引用

作者: JasonDing | 来源:发表于2016-03-17 22:38 被阅读432次

定义

特质可以要求混入它的类扩展自另一个类型,但是当使用自身类型(self type)的声明来定义特质时(this: ClassName =>),这样的特质只能被混入给定类型的子类当中。
如果尝试将该特质混入不符合自身类型所要求的类时,就会报错。

从技术角度上看,自身类型是在类中提到this时,对于this的假设性类型。从实用角度上看,自身类型指定了对于特质能够混入的具体类的需求。如果你的特质仅用于混入另一个或几个特质,那么可以指定那些假设性的特质。

自身类型在依赖注入的应用

在通过组件构建大型系统,而每个组件都有不同的实现的时候,我们需要将组件的不同选择组装起来。通常组件之间存在某种依赖关系,比如,数据访问组件可能会依赖日志功能。
每个组件都描述了它所依赖的其他组件的接口,而对实际组件实现的引用是在应用程序被组件起来的时候“注入”的。
对于Scala来说,可以通过特质和自身类型达到简单的依赖注入的效果。

自身类型实现依赖注入

对于日志功能trait Logger {def log(msg: String)},它有两个实现:ConsoleLoggerFileLogger
用户认证特质有对日志功能的依赖,用于记录认证失败:

trait Auth {
  this: Logger =>
    def login(id: String, password: String): Boolean
}

应用逻辑依赖于上述两个特质,如此定义:

trait App {
  this: Logger with Auth =>
  ...
}

然后我们可以组装应用,object MyApp extends App with FileLogger("test.log") with MockAuth("users.txt")。这里将组件黏合成了一个大类型。

蛋糕模式实现组件配置设计

蛋糕模式可以给出更好的设计,对每个服务都提供一个组件特质。
组件特质包括:

  • 任何所依赖的组件,以自身类型表述
  • 描述服务接口的特质
  • 抽象的val,该val将被初始化成服务的一个实例
  • 可以有选择地包含服务接口的实现
trait LoggerComponent {
  trait Logger {...}
  val logger: Logger
  class FileLogger(file: String) extends Logger {...}
  ...
}

trait AuthComponent {
  this: LoggerComponent => //自身类型使得可以访问日志器

  trait Auth {...}
  val auth: Auth
  class MockAuth(file: String) extends Auth {...}
  ...
}

这段代码中,我们使用自身类型表示认证组件对日志器组件的依赖。

通过在程序中进行组件配置可以让编译器帮助我们校验模块间的依赖关系:

object AppComponents extends LoggerComponent with AuthComponent {
  val logger = new FileLogger("test.log")
  val auth = new MockAuth("user.txt")
}

转载请注明作者Jason Ding及其出处
jasonding.top
Github博客主页(http://blog.jasonding.top/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页

相关文章

  • 【Scala类型系统】自身类型(self type)引用

    定义 特质可以要求混入它的类扩展自另一个类型,但是当使用自身类型(self type)的声明来定义特质时(this...

  • Essential Scala: Literals

    Scala对象系统 总体上,Scala对象系统可分为两类: 引用类型 值类型 引用类型 AnyRef的子类 使用n...

  • self-type(自身类型)

    说明:这里介绍目前为止遇到的情况,当然还有其他情况可能没有列举出来,欢迎提出 在trait中使用 在使用trait...

  • 类与对象

    类型系统 引用类型类 class指针 pointer块 block 值类型 value type基础数值类型结构 ...

  • 二、类与对象 @GeekBand

    类型系统 引用类型 reference type 类 class 指针 pointer 块 block 值类型 v...

  • 第一天:C# 值类型、引用类型、装箱与拆箱

    C#中类型分为两类: 值类型(Value Type) 引用类型(Reference Type) 值类型和引用类型是...

  • 值类型和引用类型

    [值类型和引用类型][什么是值类型(value type)和引用类型(reference type)][两者有什么...

  • object-c学习笔记(GeekBand)

    类和对象 类型系统 引用类型 reference type 类class 指针 pointer 块 block 类...

  • Swift一些说明

    1、Type: 类型的类型 术语表述为元类型:metaType元类型用.Type表示元类型的值用.self表示 ...

  • struct 、class

    struct是value type(值类型) 、 class 是 reference type(引用类型)值类型的...

网友评论

    本文标题:【Scala类型系统】自身类型(self type)引用

    本文链接:https://www.haomeiwen.com/subject/xrvclttx.html