不知道大家对java的接口是如何理解的。在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范。现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是:相对于类来说,接口是更深层次的抽象,虽然同时接口也起到了规定类的行为的作用。

和java的接口比起来,scala的Trait可能更具体一些。正如Trait的含义一样,它指的是一种特质,如果认为类有某种特质就混入对应的Trait好了。在scala中,类是对现实某一类事务的建模,而Trait则是对已有模型的补充。

个人以为,Trait这个概念理解起来要比接口更容易一些。

看个例子吧:狗是人类的好朋友,它在我们孤单的时候默默地陪伴。用scala可以这样定义:

trait Friend{
val name : String
def accompany() = println("Your friend " + name + " accompanies you")
} class Dog(val name : String) extends Friend

在代码中我们先定义了一个trait。在这个trait有一个名为name的val,但是并没有提供默认值。我们可以认为它是抽象的,需要混入trait的类提供具体的实现。这个trait还提供了一个默认的方法accompany,因为朋友的特征就是陪伴。

混入trait的类可以调用trait的方法:

new Dog("Bob").accompany()

执行结果:

此外,混入trait的类还可以重写trait的方法:

class Dog(val name : String) extends Friend{
override def accompany() = println(name + " accompanies you")
} new Dog("Bob").accompany()

执行结果:

一个类混入trait后,可以通过它的实例调用trait的方法,它的实例还可以被当做是trait的引用:

new Dog("Bob").accompany()

val bob : Friend = new Dog("Bob")
bob.accompany()

执行结果:

一个类混入trait的数量是任意的。用关键字with就可以混入更多的trait。比如,狗除了是人类的好朋友,还是忠诚的卫士,随时都会保护我们:

trait Friend{
val name : String
def accompany() = println("Your friend " + name + " accompanies you")
} trait Guard{
val name: String
def guard() = println(name + " is guarding you!")
} class Dog(val name : String) extends Friend with Guard{
override def accompany() = println(name + " accompanies you")
} val bob = new Dog("Bob")
bob.accompany()
bob.guard()

trait会被编译成接口和实现其方法的类。不过除了多继承这个方面以外,trait更像是抽象类。尽管在JAVA8以后,接口中也可以由默认方法了,但是变量的定义还是不可以的。忘了演示了,trait中还可以定义抽象方法的,可以自己试一下。

############

scala学习手记31 - Trait的更多相关文章

  1. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...

  2. scala学习手记32 - trait选择性混入

    继续上一节. 狗当然是人类的好朋友.但是藏獒呢?这玩意儿又蠢又笨又凶狠,肯定不能算很多人的好朋友了.其实,刚才那句话还可以修正一下下:我们接受的狗才是我们的好朋友. 用程序怎么实现呢?在java里面, ...

  3. Scala学习笔记--特质trait

    http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...

  4. scala学习手记33 - 使用trait进行装饰

    在上一节看到了scala的在实例一级的选择性混入就不得不感叹scala在语法上的扩展性.就通过这样一个特性scala简化了很多在java中的编程概念和设计模式. 比如说在java中常用的组合,以及装饰 ...

  5. scala学习手记40 - 使用case类

    前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match ...

  6. scala学习手记38 - 方法命名约定和for表达式

    方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...

  7. scala学习手记23 - 函数值

    scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...

  8. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  9. scala学习手记8 - 自适应的默认做法

    scala有一些默认做法,会让代码更简洁.更易读写,下面列出了这样几个特性: 1. 支持脚本.scala支持脚本,因此无须将所有的代码都放到类里.如果脚本可以满足需求,就将代码放到一个脚本里,无须再创 ...

随机推荐

  1. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  2. Spoken English Practice( Believe it or not, I don't need to make believe its a big deal. (believe,deal, You don't say))

    音标复习                                                绿色:连读:红色:略读:蓝色:浊化:橙色:弱读 口语蜕变(2017/6/25) Sorry, t ...

  3. Let's encrypt申请泛域名证书以及报错处理

    申请泛域名证书的步骤请参考该链接地址: https://www.jianshu.com/p/df6d13187578 报错信息: No matching distribution found for ...

  4. 1.java中Comparor与Comparable的问题

    1.Comparator中compare()与Comparable中compareTo()方法的区别 Treeset集合创建对象后, A:如果是空构造,即TreeSet<Student> ...

  5. MySQL Connector/C++ C++连接mysql

    MySQL :: MySQL Connector/C++ Developer Guide :: 1 Introduction to Connector/C++ https://dev.mysql.co ...

  6. cocos2d 场景切换和弹出场景、收回场景

    场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...

  7. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  8. 列表(List) 的增删改查及其他方法

    一.列表的简介   列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...

  9. Myeclipse中文乱码解决方式

    我们刚刚安装的Myeclipse有可能使用的是GBK的编码方式,而通常我们的程序都是使用的是UTF-8的编码方式,所以当我们导入一个项目的时候,会产生乱码,解决方式如下: 一.将整个project设置 ...

  10. Jenkins+maven+Tomcat+SVN一键自动打包部署应用到服务器

    今天请教了大神,终于把jenkins给搞明白了 现在做下笔记,防止自己老年痴呆又忘了怎么配置 (截图可能不够清晰,有不清楚的随时评论打call) 机器配置: 安装配置规划 机器 192.168.169 ...