Scala中Trait是一种特殊概念

首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似

在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的实现即可

类可以使用extend是关键字来继承Triat,注意这里不是Implement,而是extends,在Scala中没有Implement的概念,无论是继承还是Triat都是extends

类继承Triat后,必须实现其中的抽象方法,实现是不需要override关键字

Scala不支持对类进行多继承,但是支持多重继承triat,使用with关键字即可

triat sayHello{
def sayHello(name:String)
} triat makeFriends{
def makeFriends(p:Person)
} class Person(val name:String) extends sayHello with makeFriends{
def sayHello(otherName:String)= println("hello,"+otherName+",i'm"+name)
def makeFriends(p:Person) = println("Hello"+p.name+",I'm"+name+"i want to make friend with you ")
} val p = new Person("leo")
val p2 = new Person("jack") p.sayHello("jack")
p.makeFriends(p2

在Triat中定义具体方法

Scala中的Triat可以不是只定义抽象方法,还可以定义具体方法,此时的Triat更像是包含了通用工具方法的东西

有一个专有名词来形容这种情况,就是说Triat的功能混入了类

举例来说,triat中可以包含一些很多类都通用的功能方法,比如打印日志,sprak中就使用了triat来定义了通用日志打印法

triat Logger{
def log(message:String) = prinl("msg:"message)
} class Person(val name:String) extends Logger{
def makeFrinds(p:Person){
println("Hi,i'm"+name+",i'm glad to make friends with you ,"+p.name)
log("make friends method is invoked with parameter Person[name="+p.name+"]")
}
}

在Triat中定义具体字段

Scala中Triat可以定义具体field,此时继承triat就自动获取了triat中定义的field

但这种获取field的方式与继承扯拉学说是不同的:如果是继承class获取的field,实际是定义在父类中的。而继承triat获取的field,就直接被添加到类中

triat Person{
val eyeNum =2
} class student(name:String) extends Person{ def sayHello =println("Hi ,i'm "+name+",I have "+eyeNum+"eyes")
}

在triat中定义抽象字段

Scala中Triat可以定义抽象filed,triad中的具体方法可以依据抽象filed来编写

但是继承triat类,侧必须覆盖抽象filed,提供具体值

triat SayHello{
val mes:String
def sayHello(name:String) = println(mes+","+name)
} class Person(name:String) extends SayHello{
val msg:Stirng = "hello"
def makeFriends(p:Person){
sayHello()
println("I'm"+name+", I want to make friends with you !")
}
}

Scala编程入门---面向对象编程之Trait的更多相关文章

  1. Scala编程入门---面向对象编程之Trait高级知识

    trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...

  2. Scala编程入门---面向对象编程之对象

    对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...

  3. scala学习笔记-面向对象编程之Trait

    将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可 ...

  4. 8、scala面向对象编程之Trait

    一.Trait基础 1.将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在t ...

  5. 10、scala面向对象编程之Trait

    1.  将trait作为接口使用 2.trait中定义具体方法 3.trait定义具体字段 4.trait中定义抽象字段 5.为实例对象混入trait 6.trait调用链 7.在trait中覆盖抽象 ...

  6. Scala 面向对象编程之Trait

    将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在triat中可以定义抽象方 ...

  7. Scala编程入门---函数式编程

    高阶函数 Scala中,由于函数时一等公民,因此可以直接将某个函数传入其他函数,作为参数.这个功能是极其强大的,也是Java这种面向对象的编程语言所不具备的. 接收其他函数作为函数参数的函数,也被称作 ...

  8. Scala编程入门---函数式编程之集合操作

    集合的函数式编程: 实战常用: //map案例实战:为List中的每个元素都添加一个前缀. List("leo","Jen","peter" ...

  9. Scala编程入门---Map与Tuple

    创建Map //创建一个不可变的Map val ages = Map("Leo" -> 30,"Jen" ->25,"Jack" ...

随机推荐

  1. pig中查询top k,返回每个hour和ad_network_id下最大两个记录(SUBSTRING,order,COUNT_STAR,limit)

    pig里面是有TOP函数,不知道为什么用不了.有时间要去看看pig源码了. SET job.name 'top_k'; SET job.priority HIGH; --REGISTER piggyb ...

  2. Linux中的查找命令find

    原文:http://blog.csdn.net/windone0109/article/details/2817792 查找目录:find /(查找范围) -name '查找关键字' -type d ...

  3. Androd选取相册照片和拍照处理-android学习之旅(62)

    实现如下图所示效果 核心代码 -构建打开相册和拍照的Intent 拍照 File outputImage = new File(Environment.getExternalStorageDirect ...

  4. Linux IPC实践(5) --System V消息队列(2)

    消息发送/接收API msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由ms ...

  5. (NO.00003)iOS游戏简单的机器人投射游戏成形记(五)

    上一篇我们建立了机器人物理对象,下面我们来看看对应的逻辑代码. 进入Xcode,新建Robot和Arm类,分别继承于CCNode和CCSprite类.代码全部留空,后面再实现. 我们再看一下这个机器人 ...

  6. android studio中使用lambda

    环境准备 如果还没有安装Java 8,那么你应该先安装才能使用lambda和stream(译者建议在虚拟机中安装,测试使用). 像NetBeans 和IntelliJ IDEA 一类的工具和IDE就支 ...

  7. 【一天一道LeetCode】#67. Add Binary

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  8. Android ViewManager解读之requestLayout() 详解

    尊重原创: http://blog.csdn.net/sk719887916/article/details/48464035 上篇<Android View 中invalidate() 你所不 ...

  9. 【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  10. 网站开发进阶(二十六)js刷新页面方法大全

    js刷新页面方法大全 在项目开发过程中,需要实现刷新页面.经过学习,发现下面这条语句就可以轻松实现. location.reload(); // 刷新页面 有关刷新页面的其它方法,具体学习内容如下,有 ...